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

相关推荐
陌上丨12 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_567812 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw12 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307312 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道13 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据14 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务14 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯15 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七16 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草16 小时前
redis-9-哨兵
数据库·redis·bootstrap