5. 分组查询 GROUP BY 与 HAVING

分组查询

SELECT 分组字段,聚合字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];

GROUP BY 子句用于根据指定的列对结果集进行分组。在每个分组内,可以使用聚合函数(如 SUM、AVG、COUNT、MAX、MIN 等)对其他列进行计算。

选择列表中的非聚合列必须包含在 GROUP BY 子句中。例如,在上述语法中,分组字段必须出现在 SELECT 列表和 GROUP BY 子句中。

对比WHEREHAVING
作用时机分组前过滤分组后过滤
能否用聚合不能能(如 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;