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形影不离,专门处理聚合结果。