灌水唠嗑区
技术分享
文章

如何在实际应用中选择使用GROUP BY和HAVING?

发表于2026-05-01 09:13:4711次浏览5个评论

一、先记判断口诀

  1. 只要需要合并、统计、分组 → 必用 GROUP BY比如:按部门、按日期、按渠道、按省份统计人数、金额、订单数

  2. 过滤条件里有聚合函数(count/sum/avg) → 只能用 HAVING

  3. 过滤普通字段、行数据 → 用 WHERE,不要放 HAVING


二、实际应用选择规则

1. 什么时候必须用 GROUP BY

满足任意一条就用:

  • 按某个维度归类:按天、按月、按用户、按地区、按部门

  • SQL 里用了 count、sum、avg、max、min 聚合,且要按字段分组展示

  • 要把重复值合并成一条汇总数据

2. 什么时候必须用 HAVING

满足任意一条就用:

  • 对分组后的统计结果再筛选例:只查出订单数大于 100总金额大于 1 万的分组

  • 过滤条件里包含聚合函数,写在 WHERE 会直接报错

3. 坚决别把普通条件放 HAVING

普通字段过滤(时间、状态、性别)一律用 WHERE原因:

  • WHERE 先过滤,减少参与分组的数据量,性能高

  • HAVING 是分完组再过滤,扫的数据更多,性能差


三、实战标准模板(工作直接照写)

业务需求:统计每个部门人数,只保留人数≥3 的部门,且只查在职员工

sql

SELECT dept_id, COUNT(*) AS cnt
FROM employee
WHERE status = '在职'       -- 先筛原始行:普通条件放WHERE
GROUP BY dept_id            -- 按部门分组统计
HAVING COUNT(*) >= 3;       -- 筛分组结果:聚合条件放HAVING

 


四、一句话总结怎么选

  1. 要归类统计 → 上 GROUP BY

  2. 筛原始行、普通字段 → 用 WHERE

  3. 筛分组后的聚合结果 → 用 HAVING

  4. 能写 WHERE 绝不扔到 HAVING,性能差距很大。

评论

登录后才可以发表评论
用户头像
柒柒天晴发表于 3个月前
学习下
用户头像
GBase用户28017发表于 3个月前
学习。
曾云林发表于 2个月前
三人行必有我师
曾浩轩发表于 2个月前
继续努力
shepherd发表于 2个月前
三人行必有我师