讲师中心 微信公众号
AI工具推荐 视频效率加速

SQL中WHERE与HAVING有什么区别

老强姑娘_7039

老强姑娘_7039

发布时间:2026-08-16 09:00:44

|

784人浏览过

|

来源于php中文网

原创

WHERE不能用聚合函数,HAVING必须配合GROUP BY且能用聚合函数;因为WHERE在SQL执行顺序中早于GROUP BY和聚合计算,此时聚合值尚未生成,只能过滤原始行,而HAVING作用于分组后的结果集。

sql中where与having有什么区别

WHERE 不能用聚合函数,HAVING 必须配合 GROUP BY 且能用聚合函数——选错就报错或查不到数据。

WHERE 为什么不能写 COUNT() 或 SUM()

因为 WHERE 在 SQL 执行链里太早了:它跑在 GROUP BY 和所有聚合计算之前。这时候每行还是独立的,数据库根本还没算出哪个部门有多少人、总工资多少,COUNT(*) 或 SUM(salary) 还不存在,硬写就会报错,比如:

SELECT dept_id FROM employee WHERE COUNT(*) > 5;

典型错误提示:Error: Invalid use of aggregate function 或类似表述。

  • WHERE 只能引用原始表里的字段,比如 salary > 5000、hire_date >= '2020-01-01'
  • 它过滤的是“行”,不是“组”——哪怕你没写 GROUP BY,它也照样生效
  • UPDATE 和 DELETE 语句也能用 WHERE,但 HAVING 完全不支持这两种操作

HAVING 必须和 GROUP BY 搭配吗?

标准 SQL 要求 HAVING 前必须有 GROUP BY;少数数据库(如 SQLite)允许省略,但行为不可靠,结果可能错漏。别依赖它。

常见误写:

SELECT dept_id, COUNT(*) FROM employee HAVING COUNT(*) > 5;

表面看像能跑,实际逻辑混乱:整个表被当作一个默认分组,COUNT(*) 算的是全表总行数,不是每个部门的计数——这不是你要的“人数超 5 的部门”。

  • 正确写法必须显式 GROUP BY dept_id,再用 HAVING COUNT(*) > 5
  • HAVING 后只能用分组字段(如 dept_id)或聚合表达式(如 AVG(salary)),不能直接写 salary > 8000 ——分组后单行 salary 已丢失
  • 如果只是想筛某个固定部门,用 WHERE 更快:先过滤再分组,减少计算量

WHERE 和 HAVING 能一起用吗?怎么配才高效?

能,而且很常见。关键是分清“谁该在哪步筛”:WHERE 处理行级条件,HAVING 处理组级条件。

比如查“入职满两年、且所在部门平均工资超 15000 的员工所属部门”:

SELECT dept_id, AVG(salary) FROM employee 
WHERE hire_date <= '2024-08-04' 
GROUP BY dept_id 
HAVING AVG(salary) > 15000;
  • WHERE hire_date 先剔除新员工,缩小后续分组的数据集
  • HAVING AVG(salary) > 15000 是对每个部门算完平均值后再筛
  • 如果把 hire_date 条件挪到 HAVING 里(HAVING hire_date ),会直接报错——分组后 <code>hire_date 不再是单值
  • 性能上,WHERE 越早筛掉无用行,GROUP BY 和聚合就越轻量

容易被忽略的细节:执行顺序决定一切

SQL 写的时候从 SELECT 开头,但真正执行是:FROM → WHERE → GROUP BY → HAVING → SELECT。这个顺序不是约定,是引擎强制流程。

这意味着:

  • SELECT 里定义的别名(如 AS avg_sal)在 WHERE 和 HAVING 里都不能用——它们执行时这个别名还不存在
  • HAVING 能用 AVG(salary),但不能用 avg_sal(除非重复写表达式)
  • 如果你发现 HAVING 结果不对,先确认 GROUP BY 的列是否真能形成你要的“组”——比如漏写了关键分组字段,会导致聚合逻辑崩坏

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

3843

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

831

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1009

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

5661

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2623

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

5640

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

7421

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1010

2024.04.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

180

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn