HAVING 是 SQL 中专门对 "分组之后的聚合结果" 再做筛选的子句。
它一般跟在 GROUP BY 后面,不能单独使用 ,作用类似于分组版的 WHERE。
✅ 1. 语法位置
sql
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 的客户
sql
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形影不离,专门处理聚合结果。