5. 分组查询 GROUP BY 与 HAVING
分组查询
SELECT 分组字段,聚合字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
GROUP BY 子句用于根据指定的列对结果集进行分组。在每个分组内,可以使用聚合函数(如 SUM、AVG、COUNT、MAX、MIN 等)对其他列进行计算。
选择列表中的非聚合列必须包含在 GROUP BY 子句中。例如,在上述语法中,分组字段必须出现在 SELECT 列表和 GROUP BY 子句中。
| 对比 | WHERE | HAVING |
|---|---|---|
| 作用时机 | 分组前过滤 | 分组后过滤 |
| 能否用聚合 | 不能 | 能(如 HAVING COUNT(*)>10) |
注意事项:
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序: where > 聚合函数 > having 。
- 支持多字段分组, 具体语法为 : group by columnA,columnB
📝 本节例题
以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。
例 1
根据性别分组 , 统计男生 和 女生的数量
查看参考答案(可复制)
sql
select ssex, count(*) from student group by ssex ;
例 2
根据性别分组 , 统计男性员工 和 女性员工的平均年龄
查看参考答案(可复制)
sql
select ssex, avg(sage) from student group by ssex ;
例 3
查询年龄小于17的学生, 并根据城市分组 , 获取学生数量大于等于10的城市
查看参考答案(可复制)
sql
select sbirthplace, count(*) ac from student where sage < 17
group by sbirthplace having ac >= 10;
例 4
统计来自各个城市的男生和女生的数量
查看参考答案(可复制)
sql
select sbirthplace, ssex, count(*) '数量' from student group by sbirthplace,ssex;