SQL中的HAVING用法

HAVING 是 SQL 中专门对 "分组之后的聚合结果" 再做筛选的子句。

它一般跟在 GROUP BY 后面,不能单独使用 ,作用类似于分组版的 WHERE


✅ 1. 语法位置

sql 复制代码
SELECT 列1, 聚合函数(列2) AS 别名
FROM   表
GROUP  BY 列1
HAVING 聚合条件;   -- 这里写对聚合结果的过滤条件

✅ 2. 与 WHERE 的区别(面试高频)

子句 过滤时机 能用的表达式 作用对象
WHERE 分组前 普通列、表达式 原始行
HAVING 分组后 聚合函数、分组列 聚合结果

✅ 3. 工作流程

  1. FROM 取表
  2. WHERE 先过滤原始行
  3. GROUP BY 分组
  4. 对每组算聚合值
  5. HAVING 再按聚合值筛组
  6. SELECT 输出最终列
  7. 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 形影不离,专门处理聚合结果。

相关推荐
共享家95276 分钟前
MySQL-内置函数
数据库·mysql
得意霄尽欢12 分钟前
MySQL底层数据结构与算法浅析
数据库·mysql
叫我阿柒啊42 分钟前
Java全栈工程师的面试实战:从技术细节到业务场景
java·数据库·spring boot·微服务·vue·全栈开发·面试技巧
1688red43 分钟前
openEuler系统实现MySQL数据库主从复制
数据库·mysql
祢真伟大1 小时前
dm8_静默安装简单快速
数据库
甄天2 小时前
SQL-Server分页查询多种方法讲解以及分页存储过程
数据库·sql
老华带你飞3 小时前
校园二手书交易|基于SprinBoot+vue的校园二手书交易管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·小程序·毕设·校园二手书交易管理系统
爱思德学术3 小时前
中国计算机学会(CCF)推荐学术会议-B(数据库/数据挖掘/内容检索):EDBT 2026
大数据·数据库·数据管理
vivi_and_qiao4 小时前
数据库学习笔记
数据库·笔记·学习
秋难降5 小时前
MySQL 优化:告别 “996”,让系统高效运行
数据库·后端·mysql