MySQL分组和聚合函数

聚合函数

聚合函数在计算时会自动忽略空值,不用手动写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 : 对最终生成的临时表的数据行,进行截取