当前位置: 首页
数据库
如何在SQL中利用GROUP BY和HAVING过滤分组后的数据详细教程

如何在SQL中利用GROUP BY和HAVING过滤分组后的数据详细教程

热心网友 时间:2026-06-30
转载
GROUP BY 和 HA VING 得联手才能发挥过滤分组结果的作用;单独甩一个 HA VING 出来,数据库直接报错——因为连分组都没做,哪来的“分组后”数据可以筛?另外,SELECT 里那些非聚合字段,必须老老实实出现在 GROUP BY 子句里,否则会触发 ERROR 1055;HA VING 呢,只能引用聚合函数或者分组字段,原始行里的单值字段就别想了。

如何在SQL中利用GROUP BY和HA VING过滤分组后的数据?

说白了,GROUP BY 和 HA VING 是“捆绑销售”——单独写 HA VING 就是找死,因为没有分组就没有“分组后”的数据可筛。

GROUP BY 后 SELECT 字段必须合法

MySQL(以及大多数标准 SQL)有个硬规矩:SELECT 列表里出现的每个非聚合字段,都得出现在 GROUP BY 子句中。否则,严格模式下直接给你甩个 ERROR 1055,毫不留情。

  • ✅ 正确写法:SELECT department, COUNT(*) FROM employees GROUP BY department; —— 所有非聚合字段都在 GROUP BY 里,没问题。
  • ❌ 错误示范:SELECT name, department, COUNT(*) FROM employees GROUP BY department; —— name 既没在 GROUP BY 里,也没套上聚合函数,数据库一脸懵:到底取哪一行的 name?
  • ⚠️ 提醒一下:MySQL 5.7+ 默认启用了 ONLY_FULL_GROUP_BY 模式,这个限制是写死的。有人想关掉它逃避错误,但关掉只是掩盖问题,不是解决问题,该按规矩来还是得按规矩来。

HA VING 只能用聚合结果或分组字段做条件

HA VING 是对“每组聚合完之后”那行结果做判断,所以条件里放心用 COUNT(*)SUM(amount) 这些聚合函数就行,但不能打原始行单值字段的主意(除非那个字段也在 GROUP BY 里)。

  • ✅ 正确用法:HA VING COUNT(*) > 3HA VING A VG(salary) >= 12000HA VING department = 'tech'(因为 department 是分组字段,没问题)
  • ❌ 错误用法:HA VING salary > 10000 —— salary 不是分组字段,也不是聚合结果,这一行根本就不存在于 HA VING 执行时的上下文里,数据库会直接报错。
  • ? 小技巧:如果想先筛出高薪员工再分组,应该用 WHERE salary > 10000 放在 GROUP BY 前面,而不是硬塞进 HA VING 里。WHERE 是分组前干的活,HA VING 是分组后干的活,分工明确。

WHERE 和 HA VING 的执行顺序不能颠倒

SQL 实际执行顺序是这样的:FROM → WHERE → GROUP BY → 聚合计算 → HA VING → SELECT → ORDER BY。这个顺序决定了什么能做什么不能做,搞反了就出岔子。

  • WHERE 在分组前运行,所以效率更高——能提前砍掉大量不需要的数据,减少参与分组的行数,对大表来说至关重要。
  • HA VING 在分组后运行,是对已经算好的组进行筛选,无法绕过聚合计算。比如 HA VING COUNT(*) > 100,数据库必须先把所有组的计数全算出来,再一个一个比较。
  • ? 场景对比:查“订单总额超过 5000 且下单次数 ≥ 3 的客户”。
    → 先 WHERE order_date >= '2025-01-01' 缩小范围;
    → 再 GROUP BY customer_id
    → 最后 HA VING SUM(amount) > 5000 AND COUNT(*) >= 3

容易被忽略的一点是:HA VING 条件里写的别名(比如 AS total),在某些数据库(如 PostgreSQL)里可以直接用,但在 MySQL 8.0 之前不支持——得老老实实重复写 SUM(amount) > 5000,不能写 total > 5000。别名能不能用,取决于具体版本和 SQL 模式,千万别默认它一定行,提前查一下文档更稳妥。

来源:https://www.php.cn/faq/2658967.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
MyBatis Hive多表关联实现方法

MyBatis Hive多表关联实现方法

MyBatis处理Hive多表关联查询与普通数据库类似。需准备映射文件,使用association和collection标签定义关联;创建Java实体类包含集合成员变量承接一对多关系;编写Mapper接口声明查询方法;配置MyBatis环境注册映射;最后通过SqlSession调用即可获取关联数据。

时间:2026-07-01 07:08
提升Hive Metastore查询速度的有效方法

提升Hive Metastore查询速度的有效方法

HiveMetastore查询优化需从存储优化、缓存机制、查询策略、索引构建、并行能力、配置调优、硬件升级、数据分区及定期维护等多方面协同入手,综合提升系统吞吐量与响应速度,有效降低查询延迟。

时间:2026-07-01 07:08
Hive Metastore处理大数据的核心机制

Hive Metastore处理大数据的核心机制

HiveMetastore管理元数据,通过分库分表、读写分离应对海量元数据,调整JVM堆内存并采用G1GC提升稳定性,利用HDFS或云存储及CBO优化器加速查询,在大数据场景下提供高效元数据服务。

时间:2026-07-01 07:08
Kafka Coordinator 如何监控集群的完整方法与最佳实践指南

Kafka Coordinator 如何监控集群的完整方法与最佳实践指南

Kafka协调器监控可通过命令行工具、KafkaManager及JMX实时查看消费者滞后、分区状态等性能指标,并利用Prometheus+Grafana实现长期可视化监控与告警,从而确保集群稳定运行。

时间:2026-07-01 07:08
Hive中row_number()函数性能的实用高效监控方法与优化技巧

Hive中row_number()函数性能的实用高效监控方法与优化技巧

Hive中row_number()性能受数据量、索引、查询复杂度及数据倾斜影响。优化需通过分区、建索引、查询优化、使用ORC Parquet格式及调整CBO和并行度实现。监控可借助HiveWebUI、YARN界面、日志或第三方工具定位瓶颈,持续迭代改进。

时间:2026-07-01 07:08
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全