2.3 GROUP BY 与 HAVING
GROUP BY 用来把多行折叠成组,再对每组做统计。常见聚合函数包括:
COUNT(*):计数。SUM(amount):求和。AVG(score):平均值。MIN(value)、MAX(value):最小值、最大值。
从行到组
sql
SELECT course_id, COUNT(*) AS student_count
FROM enrollments
GROUP BY course_id;这会按 course_id 分组,每组输出一行统计结果。
HAVING 过滤分组结果
sql
SELECT course_id, COUNT(*) AS student_count
FROM enrollments
GROUP BY course_id
HAVING COUNT(*) >= 2;WHERE 过滤的是分组前的原始行,HAVING 过滤的是分组后的结果。
正在加载概念检查...
聚合查询的可移植习惯
sql
SELECT c.title,
COUNT(*) AS student_count,
AVG(s.score) AS avg_score
FROM courses AS c
JOIN students AS s
ON s.course_id = c.course_id
GROUP BY c.title
HAVING AVG(s.score) >= 80
ORDER BY avg_score DESC;可移植习惯:SELECT 里的非聚合字段,应当出现在 GROUP BY 中,或由分组字段推导而来。
注意
产品差异提醒:有些数据库在
GROUP BY 后允许选择未分组列,有些会报错。为了跨产品清晰,初学时坚持“分组列 + 聚合表达式”的写法。正在加载交互实验...
正在加载概念检查...
聚合不是明细
聚合结果已经失去单行明细。比如一门课平均分是 88,你不能从这一行统计结果中知道每个学生是谁。需要明细时,回到原始表或使用窗口函数。
注意
产品差异提醒:窗口函数是 SQL 的高级能力,PostgreSQL、MySQL 8+、SQL Server、Oracle 都支持很多窗口函数;SQLite 新版本也支持一部分。具体函数和性能细节请查产品文档。
正在加载本节练习...