HAVING
是 SQL 中专门对 “分组之后的聚合结果” 再做筛选的子句。
它一般跟在 GROUP BY
后面,不能单独使用,作用类似于分组版的 WHERE
。
✅ 1. 语法位置
SELECT 列1, 聚合函数(列2) AS 别名
FROM 表
GROUP BY 列1
HAVING 聚合条件; -- 这里写对聚合结果的过滤条件
✅ 2. 与 WHERE 的区别(面试高频)
子句 | 过滤时机 | 能用的表达式 | 作用对象 |
---|---|---|---|
WHERE | 分组前 | 普通列、表达式 | 原始行 |
HAVING | 分组后 | 聚合函数、分组列 | 聚合结果 |
✅ 3. 工作流程
FROM
取表WHERE
先过滤原始行GROUP BY
分组- 对每组算聚合值
HAVING
再按聚合值筛组SELECT
输出最终列ORDER BY
排序(如有)
✅ 4. 示例表:orders
order_id | customer | amount |
---|---|---|
1 | Alice | 100 |
2 | Bob | 200 |
3 | Alice | 150 |
4 | Bob | 50 |
5 | Carol | 300 |
🔍 需求:找出 总消费 ≥ 250 的客户
SELECT customer,SUM(amount) AS total
FROM orders
GROUP BY customer
HAVING SUM(amount) >= 250;
结果:
customer | total
---------|-------
Alice | 250
Carol | 300
- 先按
customer
分组,算每人总额 - 再用
HAVING
筛掉Bob
(总额 250 以下)
✅ 5. 常见场景
- 统计部门平均工资高于 1 万的部门
- 找出销量超过 100 件的商品
- 查询下单次数 ≥ 3 次的用户
✅ 6. 易错点
- 把 非聚合列 放进
HAVING
会报错(除非该列同时出现在GROUP BY
里) - 忘记先
GROUP BY
→ 语法错误 - 用
WHERE
写聚合条件 → 也报错
✅ 7. 一句话总结
HAVING
就是 “分组后再筛组” 的专用工具,和GROUP BY
形影不离,专门处理聚合结果。