SQL分组统计核心是正确使用GROUP BY与聚合函数,并用HAVING过滤分组结果;需确保SELECT非聚合字段全在GROUP BY中,注意NULL归组特性,优先采用条件聚合而非多子查询。

SQL分组统计核心就两点:用好 GROUP BY 搭配聚合函数,再配合 HAVING 精准过滤分组结果。写错顺序、忽略NULL处理或滥用子查询,是效率低和结果出错的主因。
GROUP BY 必须包含所有非聚合字段
SELECT 后出现的非聚合列(比如 name、status),必须全部写进 GROUP BY 子句,否则多数数据库会报错(如 PostgreSQL、SQL Server);MySQL 5.7+ 严格模式下同样受限。
- ✅ 正确写法:SELECT dept, COUNT(*) FROM emp GROUP BY dept;
- ❌ 错误写法:SELECT dept, name, COUNT(*) FROM emp GROUP BY dept;(name 未参与分组,语义模糊)
- ? 如果真要查每个部门的某个人名,需明确逻辑:用 MAX(name)、MIN(name),或结合窗口函数取首行。
用 HAVING 替代 WHERE 过滤分组结果
WHERE 在分组前筛选原始行,HAVING 在分组后筛选“组”——这是关键区别。想查“员工数超5人的部门”,必须用 HAVING。
- ✅ 正确:SELECT dept, COUNT(*) c FROM emp GROUP BY dept HAVING c > 5;
- ❌ 错误:SELECT dept, COUNT(*) c FROM emp WHERE c > 5 GROUP BY dept;(WHERE 不认识别名 c,也不作用于聚合结果)
- ? HAVING 支持聚合函数和列别名,WHERE 不支持。
NULL 值会被自动归为一组,但容易被忽略
GROUP BY 字段含 NULL 时,所有 NULL 值会聚成单独一组。如果你没意识到,可能误以为“数据丢了”或漏统计。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~