首页 > 数据库 > SQL > 正文

SQL分组后筛选怎么写_HAVING使用场景详解【教学】

冰川箭仙
发布: 2025-12-20 11:10:48
原创
848人浏览过
SQL分组后筛选必须用HAVING而非WHERE,因为WHERE在分组前执行,无法识别COUNT()等聚合函数结果;HAVING在GROUP BY之后执行,可基于聚合值过滤分组。

sql分组后筛选怎么写_having使用场景详解【教学】

SQL分组后筛选要用 HAVING,不能用 WHERE。因为 WHERE 在分组前过滤数据,HAVING 才是在 GROUP BY 之后对分组结果做条件筛选。

为什么不能用 WHERE 筛选分组结果?

WHERE 是在数据分组前执行的,它无法识别聚合函数(如 COUNT()、SUM()、AVG() 等)的结果。比如你想查“订单数超过 5 的客户”,COUNT(*) 是每个分组算出来的,WHERE 根本看不到这个值。

错误写法(会报错):

SELECT customer_id, COUNT(*) FROM orders WHERE COUNT(*) > 5 GROUP BY customer_id;

正确逻辑:先 GROUP BY → 再计算每组的 COUNT(*) → 最后用 HAVING 过滤这些统计值。

HAVING 的基本写法和关键规则

HAVING 必须跟在 GROUP BY 后面(如果有 GROUP BY),可以单独使用,也可以和 WHERE 一起用(WHERE 先过滤行,GROUP BY 分组,HAVING 再过滤组)。

  • HAVING 后的条件可以是聚合函数,比如 HAVING COUNT(*) >= 3
  • 也可以是分组字段,比如 HAVING MAX(amount) > 1000
  • 支持 AND/OR/NOT 组合多个条件,例如 HAVING AVG(score) >= 85 AND COUNT(*) > 10
  • 注意:SELECT 中出现的非聚合字段,必须出现在 GROUP BY 中,否则多数数据库会报错(如 MySQL 严格模式、PostgreSQL)

常见实战场景举例

场景1:找出买了至少 3 种商品的客户

AI社交封面生成器
AI社交封面生成器

一句话/一张图一键智能生成社交媒体图片的AI设计神器

AI社交封面生成器 108
查看详情 AI社交封面生成器
SELECT customer_id, COUNT(DISTINCT product_id) AS product_count
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) >= 3;

场景2:筛选平均消费超 500 元且下单次数不少于 2 次的会员

SELECT member_id, AVG(total_amount) AS avg_spend, COUNT(*) AS order_cnt
FROM orders
WHERE status = 'completed' -- 先排除取消单
GROUP BY member_id
HAVING AVG(total_amount) > 500 AND COUNT(*) >= 2;

场景3:查看哪些部门的员工平均薪资高于公司整体平均值

SELECT dept, AVG(salary) AS dept_avg
FROM employees
GROUP BY dept
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

HAVING 和 WHERE 的执行顺序要记牢

一条含 GROUP BY 和 HAVING 的查询,实际执行顺序是:

  • FROM → 找表
  • WHERE → 先筛原始行(不能用聚合)
  • GROUP BY → 分组
  • HAVING → 筛分组(能用聚合)
  • SELECT → 选字段(含聚合或分组字段)
  • ORDER BY → 排序(可基于 SELECT 中的别名)

记住了这个顺序,就不会混淆 WHERE 和 HAVING 该放哪、能写什么了。

以上就是SQL分组后筛选怎么写_HAVING使用场景详解【教学】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号