分组函数(多行处理函数)
多个数据对应一个结果
count
sum
avg
max
min
注:
- 必须先分组才能使用,如果没有分组,整张表默认为一组。
- 分组函数自动忽略null,不需要提前对null处理
- count(*) 和 count(字段) 区别在于,前者统计表的行数,后者统计不为null的数量。
- 不能直接使用在
where
子句中,比如select sal from emp where sal > min(sal);
是无效的。(在分组查询部分解释) - 所有分组函数可以组合使用。
分组查询
格式:
select ... from ... group by
情景:计算某个部门的工资和、计算某岗位的工资和。
注意:执行顺序为
from->where->group by->select->order by
所以前面之所以不能在where
中使用分组函数,是因为where执行时,还没有到group by
的执行时间,而分组函数必须先分组才能使用。
由于select在group by之后执行,语法上已经分组完毕,所以可以在select中使用。
如果语句有group by字段,则select后面跟着的字段只能是分组函数要执行的字段+被分组的字段
根据多个字段分组:可以在group by字段后面增加多个字段。
having
如果想在group by之后再处理,可以使用having
关键字,但不能代替where,必须联合group by一起使用。
执行顺序在group by之后
和where的区别在于,where先筛选再分组,having先分组再筛选。
优化策略:先使用where,再使用having
使用场景:where做不到的情况,比如:求平均工资大于2500的部门,由于平均工资只有进行分组函数avg计算后才能得出,只能通过having在avg分组之后在进行筛选。
总结
MySQL的执行顺序是值得深思的。
先取出数据,筛选一次,再分组,分组之后根据现有数据在筛选,然后选择想要的数据,最后确认是否排序。