Mysql之高级查询
一、函数&分组查询
1、函数
Mysql已经定义好的,可以实现一定功能的代码块
日期函数、数字函数、字符函数、聚合函数
聚合函数:聚合函数对整体进行运算,通常返回的结果只有一个
min() max() avg() count() sum()
二、SQL关联查询
1、什么叫关联查询
关联查询又叫做连接查询,常见的连接查询可分为:内连接、外连接、自连接
#查询员工编号(empno)为7788的员工姓名(ename)和所在部门的名称(dname)
三、SQL子查询
嵌套查询,将一个查询结果当做另一个查询的条件或结果集。子查询最接近思考方式,最自然的查询。
分类:单行子查询,多行子查询
单行子查询:子查询的返回结果只有一条记录
多行子查询:子查询的返回结果有多条记录
-- emp员工表
-- 查看10号部门最小工资
-- 1:找出10号部门的所有人的薪资
select min(sal) from emp where deptno=10;
-- 查看20号部门最高工资
select max(sal) from emp where deptno=20;
-- 查看30号部门的平均工资
select avg(sal) from emp where deptno=30;
-- 统计奖金列不是null值的员工人数
select count(comm) from emp; #4个 count() 统计的字段的非空值的数量
-- 统计2月份入职的所有员工的薪资总和
-- 1:2月份入职的所有员工
select empno,month(hiredate) 月份 from emp; #month('1991-10-15') 获取日期月份 year('1991-10-15') 获取日期年份 day('1991-10-15') 获取日期号
select * from emp where month(hiredate)=2;
-- 2:薪资总和
select sum(sal) from emp where month(hiredate)=2;
-- 分组函数 group by ...having
#求每个部门的平均工资
-- 1:按照部门的编号分组
select deptno,avg(sal) from emp group by deptno;
#注意:分组之后,select 后面并不是所有的字段都可以接的
-- 分组:把重复的值去掉,只会保留一个
-- select ename -->多个值
select * from emp where deptno=30; --多个值
#查询平均工资大于2000的部门的编号和平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
-- where:条件筛选,where后面不可以接聚合函数,where单独使用使用
select * from emp where max(sal)>3000; #Invalid use of group function
-- having:条件筛选,having 后面可以接聚合函数,having搭配group by使用
--内连接
-- 没有主从表之分,只会将两个表中相等的值列出在结果集中
#查询员工编号(empno)为7788的员工姓名(ename)和所在部门的名称(dname)
empno=7788 ename =scott -->emp表
empno=7788 deptno=20 -->emp表 dname=RESEARCH -->dept
select ename,dname from emp inner join dept on emp.deptno=dept.deptno and empno=7788;
--左外连接
-- 主表、从表 left join 前面的是主表,后面的是从表,会遍历主表中的每一个条记录,
#查询所有部门的名称(dname)和该部门对应的员工姓名(ename)
select * from dept left join emp on dept.deptno=emp.deptno;
#查询所有员工的名称(dname)和员工所所在部门的名称(dname)
select * from emp left join dept on dept.deptno=emp.deptno;
--右外连接
-- 主表、从表 right join 前面的是从表,后面的是主表,会遍历主表中的每一个条记录,
#查询所有部门的名称(dname)和该部门对应的员工姓名(ename)
select dname,ename from emp right join dept on dept.deptno=emp.deptno;
#自连接
#查询所有员工和他上级领导的姓名
select * from emp;
select e.ename 员工,p.ename 上级领导 from emp e left join emp p on e.mgr=p.empno;
-- 子查询
-- 单行子查询
-- 案例:#查询和scott在同一部门的所有员工信息
select * from emp where deptno=(select deptno from emp where ename='SCOTT');
-- 1:scott所在部门编号
select deptno from emp where ename='SCOTT';
-- 2:找到员工和scott部门编号一致的
select * from emp where deptno=(select deptno from emp where ename='SCOTT');
-- 多行子查询
#查询薪水和20号部门员工相等的不在20号部门员工的信息
select * from emp where sal in (select sal from emp where deptno=20) and deptno!=20;
-- 1:20号部门每个员工的薪水
select sal from emp where deptno=20;
-- 2:找到薪水一样,但是不在20部门的员工
select * from emp where sal in (select sal from emp where deptno=20) and deptno!=20;
四:练习
1.大于20号部门的平均工资的20号部门的员工信息
select * from emp where sal>(select avg(sal) from emp where deptno=20) and deptno=20
2.查询大于所在部门平均工资的员工信息
select * from emp a inner join (select deptno,avg(sal) avgsal from emp group by deptno) b on a.deptno=b.deptno and a.sal>b.avgsal
3.查询工资大于20号部门员工工资的所有员工信息
select * from emp where sal>(select max(sal) from emp where deptno=20)
4.薪水大于2000的员工所在部门的信息
select dept.* from dept left join emp on dept.deptno=emp.deptno and emp.sal>2000