SQL分组统计怎么做_重要技巧总结提升查询效率【教程】

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

SQL分组统计怎么做_重要技巧总结提升查询效率【教程】-第1张图片-佛山资讯网

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 值会聚成单独一组。如果你没意识到,可能误以为“数据丢了”或漏统计。

标签: mysql 区别 聚合函数

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~