SQL 分组查询如何使用 HAVING 条件?

来源:站长素材作者:高宇头衔:草根站长
导读:本期聚焦于小伙伴创作的《SQL 分组查询如何使用 HAVING 条件?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL 分组查询如何使用 HAVING 条件?》有用,将其分享出去将是对创作者最好的鼓励。

SQL分组查询中,HAVING条件用于对GROUP BY子句生成的分组结果进行筛选,它和WHERE条件的作用阶段不同,适用场景也有明显区别。

HAVING条件的基本作用

在使用GROUP BY对数据进行分组后,我们往往需要对分组后的结果做进一步筛选,比如只保留订单数量超过10的用户分组,这时候就需要用到HAVING条件。HAVING条件可以直接对分组后的聚合结果进行判断,这是WHERE条件无法做到的。

HAVING和WHERE的核心区别

很多开发者会混淆HAVING和WHERE的使用场景,两者的核心差异如下:

  • WHERE条件在分组之前执行,用于筛选原始数据行,不能包含聚合函数
  • HAVING条件在分组之后执行,用于筛选分组结果,可以包含聚合函数
  • WHERE条件中不能使用分组后的聚合计算结果,HAVING条件可以

HAVING条件的使用语法

HAVING条件需要跟在GROUP BY子句之后,基本语法结构如下:

-- 基本语法
SELECT 分组字段, 聚合函数(字段)
FROM 表名
WHERE 行筛选条件  -- 可选,分组前的筛选
GROUP BY 分组字段
HAVING 分组筛选条件;  -- 分组后的筛选

具体使用示例

假设我们有一张order_info订单表,表结构如下:

字段名类型说明
order_idint订单ID
user_idint用户ID
order_amountdecimal订单金额
order_datedate订单日期

示例1:筛选订单数量大于5的用户

我们需要统计每个用户的订单数量,只保留订单数超过5的用户,SQL语句如下:

SELECT user_id, COUNT(order_id) AS order_count
FROM order_info
GROUP BY user_id
HAVING COUNT(order_id) > 5;

示例2:结合WHERE和HAVING使用

如果我们只需要统计2024年之后的订单,并且筛选出总订单金额超过1000的用户,就需要先使用WHERE筛选时间,再用HAVING筛选总金额:

SELECT user_id, SUM(order_amount) AS total_amount
FROM order_info
WHERE order_date >= '2024-01-01'
GROUP BY user_id
HAVING SUM(order_amount) > 1000;

示例3:HAVING中使用多个条件

HAVING条件和WHERE条件一样,支持使用AND、OR组合多个筛选条件,比如筛选订单数大于5且平均订单金额大于200的用户:

SELECT user_id, COUNT(order_id) AS order_count, AVG(order_amount) AS avg_amount
FROM order_info
GROUP BY user_id
HAVING COUNT(order_id) > 5 AND AVG(order_amount) > 200;

使用注意事项

  • HAVING条件中如果引用了聚合函数,聚合函数的计算是基于每个分组内的数据,不是全表数据
  • 如果查询中没有使用GROUP BY子句,部分数据库也支持使用HAVING,此时相当于对全表结果做筛选,效果和WHERE类似,但不建议这样使用
  • HAVING条件中可以直接使用SELECT子句中定义的别名,比如上面的order_count别名可以直接用在HAVING中:HAVING order_count > 5,不过部分旧版本数据库可能不支持,需要根据实际数据库版本调整
注意:不同数据库对HAVING语法的支持细节可能有差异,比如MySQL和PostgreSQL在HAVING中使用别名的规则略有不同,实际使用时建议参考对应数据库的官方文档。

SQL分组查询HAVING聚合函数修改时间:2026-07-24 09:33:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。