聚合函数
聚合函数在计算时会自动忽略空值,不用手动写sql将空值排除。
聚合函数不能直接写在where语句的后面。
sum()求和函数
取得薪水的合计:
select sum(sal) from emp;
取得总共薪水(工资+补助)合计:
select sum(sal+ifnull(comm,0)) from emp;
avg()取平均值函数
取得平均薪水:
select avg(sal) as avgsal from emp;
max()取得最大值函数
取得最高薪水:
select max(sal) as maxsal from emp;
取得最晚入职的日期:
select max(hiredate) as lastemp from emp;
说明:日期也可以使用max()函数进行比较
min()取得最小值函数
取得薪水最低值:
select min(sal) as minsal from emp;
count()取得数据总数
取得所有员工数:
select count(*) from emp;
取得补助不为空的员工数:
select count(comm) from emp;
说明:count()函数不会统计数据为null的记录
统计没有补助的员工数:
select count(*) from emp where comm is null;
组合聚合函数
sum、avg、max、min、count这些函数可以一起使用:
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
distinct去除重复记录
作用:将查询结果中某一字段的重复记录去除掉
用法:distinct 字段名或 distinct字段名1, 字段名2…
注意:distinct只能出现在所有字段最前面,后面如果有多个字段及为多字段联合去重。
查询公司有哪些工作岗位:
select distinct job from emp;
查询公司工作岗位数量:
select count(distinct job) from emp;
去除部门编号deptno和工作岗位job重复的记录:
select distinct job,deptno from emp;
说明:会去除job和deptno同时相同的记录
group by分组
找出每个职位的最高薪水:
select max(sal) as maxsal from emp group by job;
说明:按照工作岗位分组,分组后计算每个工作岗位的最高薪水,还可以这样写:
select job,max(sal) as maxsal from emp group by job;
下面写法不正确,注意:在有group by的DQL询句中,select语句后面只能跟 聚合函数 + 参与分组的字段
select ename,job,max(sal) as maxsal from emp group by job;
计算每个工作岗位的最高薪水,并且按照由低到高进行排序:
select job,max(sal) as maxsal from emp group by job order by maxsal;
说明:按照工作岗位分组,分组后计算每个工作岗位的最高薪水,之后再根据薪水排序。注意order by语句只能放在group by语句后面。
计算每个部门的平均薪水:
select deptno,avg(sal) as avgsal from emp group by deptno;
计算出不同部门不同岗位的最高薪水:
select deptno,job,max(sal) as maxsal from emp group by deptno,job;
说明:group by后面可以写多个字段,数据库会分别对这些字段进行分组。
计算除了manager之外的每个工作岗位的最高薪水:
select job,max(sal) as maxsal from emp where job <> 'MANAGER' group by job;
说明:先将manager排除,然后进行分组计算。
having过滤
作用:如果想对分组的数据进行过滤,需要使用having子句。
找出每个工作岗位的平均薪水,要求显示平均薪水大于2000的:
select job,avg(sal) as avgsal from emp where avg(sal)>2000 group by job;
上面写法不正确,where后面不能直接使用聚合函数。
正确写法需要使用having来过滤:
select job,avg(sal) from emp group by job having avg(sal) > 2000;
注意:能够在where后过滤的数据不要放到having中进行过滤,否则影响SQL询句的执行效率。
where和having区别
- where和having都是为了完成数据的过滤,它们后面都是添加条件;
- where是在 group by之前完成过滤;
- having是在group by之后完成过滤;
select语句总结
一个的SQL语句如下:
select
xxxx
from
xxxx
where
xxxx
group by
xxxx
having
xxxx
order by
xxxx
以上关键字的顺序不能变,严格遵守
以上语句的执行顺序:
- from 将硬盘上的表文件加载到内存
- where:将符合条件的数据筛选出来。生成一张新的临时表
- group by :根据列中的数据种类,将当前临时表划分成若干个新的临时表
- having : 可以过滤掉group by生成的不符合条件的临时表
- select : 对当前临时表进行整列读取
- order by : 对select生成的临时表,进行重新排序,生成新的临时表
- limit : 对最终生成的临时表的数据行,进行截取