目录
4. 分组查询(group by)
4.1 概述
4.2 分组函数
4.2.1 单个使用
4.2.2 组合使用
4.2.3 注意!
4.3 group by
4.3.1 单个字段
4.3.2 多个字段
4.3.3 提醒!
4.4 having
4.5 分组查询演示
4. 分组查询(group by)
分组查询在DQL语句中非常重要,非常值得花费时间进行学习;
4.1 概述
什么是分组查询呢?
举一个例子,查询一个 student 表中男生的平均成绩,我们首先需要将表分为男,女两个部分,求男生分数的总和,最后求出平均分即可。这个问题就是分组查询。
那么求男生分数的总和需要用到聚合函数,因此在学习分组查询前需要学习聚合函数。
4.2 分组函数
分组函数又叫做聚合函数,经常与关键字 group by 搭配使用,分组函数共有五个:
COUNT():统计数量:
MAX:求最大值,
MIN:求最小值;
SUM:求和;
AVG:求平均数
4.2.1 单个使用
sum:求和;
count:计数;
max:最大值;
min:最小值;
avg:平均值;
4.2.2 组合使用
如下,可以同时使用分组函数;
4.2.3 注意!
(1)分组函数自动忽略空,因此 count 不能统计值为 null 的列。我们经常统计主键来进行计算。
如果统计所有列的话,可以使用 select count(*)from 表名(对所有记录的处理,输出结果为整张表所有记录的行数);
即某一行的每一列都不为空,该行就会被统计,避免因字段内容为 null 而忽略统计;
如下,统计的 comm 只有 4 个,但整张表有14 行记录,这是因为 comm 的内容为 null 的10 行没有被统计;
此外, count ( * ) 与 count (常数)的效果是一样的;
(2)null 不参与所有聚合函数的计算;
这与前面所说的分组函数自动忽略 null 有关;
(3)分组函数必须先分组再使用(以上演示分组函数没有使用 group by,则默认整张表是一组);
(4)分组函数不能直接在 where 子句中使用,即不能充当 where 的条件;
这涉及到执行顺序:from > where > group by > select > order by ;
如下,分组函数与 where 同时使用,当然会报错;
4.3 group by
4.3.1 单个字段
分组查询需要使用 group by 关键字 ;
4.3.2 多个字段
group by 后面可以有多个字段;
如下,查询每个部门不同岗位的的平均薪资;
4.3.3 提醒!
DDL 语句中有 group by 的话,select 后面只能是参与分组的字段或参与分组函数的字段,或者这两者的组合;
4.4 having
having 与 where 功能相似,都是过滤的作用;
但是,where 是 group by 之前过滤,having 是 group by 之后过滤;
having 必须搭配 group by 使用;
另外, 越早过滤效率越高;
4.5 分组查询演示
在查询数据时,很多时候目标远大 ,一次很难达到,不如将目标分解,一步一步去实现,脚踏实地,稳扎稳打;
如下,分为两次去实现;
当然,也可以这样写,使查询效率更高;