当前位置: 首页
数据库
SQL如何对数据进行分组统计?GROUP BY聚合函数应用

SQL如何对数据进行分组统计?GROUP BY聚合函数应用

热心网友 时间:2026-04-25
转载

SQL如何对数据进行分组统计?GROUP BY聚合函数应用

SQL如何对数据进行分组统计?GROUP BY聚合函数应用

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

说到数据分组统计,GROUP BY绝对是绕不开的核心。但你真的用对了吗?先记住一个核心原则:GROUP BY必须与聚合函数配合使用,非聚合字段须出现在GROUP BY子句中或包裹于聚合函数内;HA VING用于分组后过滤,WHERE用于分组前过滤;多字段分组按顺序影响语义,NULL值在分组中被视为同一组。

GROUP BY 必须和聚合函数一起用,单独写会报错

直接写 SELECT name FROM users GROUP BY city 会怎么样?在大多数现代数据库(比如 MySQL 8.0+、PostgreSQL、SQL Server)里,这条语句会直接报错,提示你 column “name” must appear in the GROUP BY clause or be used in an aggregate function。道理很简单:分组之后,每个城市对应的name可能有好几个,数据库引擎根本不知道该返回哪一个给你。

所以,正确的做法是:所有没被聚合的字段,要么老老实实放进GROUP BY子句,要么就包裹在聚合函数里。来看几个例子:

  • SELECT city, COUNT(*) FROM users GROUP BY city ✅ 清晰明了,统计每个城市的人数。
  • SELECT city, MAX(age), A VG(salary) FROM users GROUP BY city ✅ 找出每个城市里最年长的员工和平均薪资。
  • SELECT city, name FROM users GROUP BY city ❌ 这是个典型的错误写法。虽然在MySQL 5.7的某些兼容模式下可能“侥幸”执行,但返回的结果往往是不可靠的,可能只随机返回每组中的一条name,千万别依赖这种行为。

HA VING 用来过滤分组结果,WHERE 不能替代它

这是另一个高频混淆点。WHEREHA VING虽然都用于过滤,但执行的时机完全不同:WHERE在分组之前过滤行,而HA VING在分组之后过滤组。如果你想找出“用户数超过5个的城市”,直接写WHERE COUNT(*) > 5是行不通的——因为WHERE执行时,COUNT(*)这个聚合结果还没计算出来呢,数据库会直接报错 aggregate function calls cannot be used in WHERE

实际工作中,记住这个流程:

  • 先用WHERE把不需要的数据筛掉(比如WHERE status = ‘active’),这样能减少后续分组计算的数据量,提升性能。
  • 再用GROUP BY进行分组。
  • 最后用HA VING对聚合后的结果进行筛选(比如HA VING COUNT(*) >= 5)。

另外,HA VING子句里可以使用字段的别名,但要注意数据库的兼容性。比如在MySQL中,你可能需要给别名加上反引号,或者干脆直接使用原始的聚合表达式更保险。

来看一个完整的示例:

SELECT city, COUNT(*) AS user_cnt
FROM users
WHERE deleted = 0
GROUP BY city
HA VING COUNT(*) > 5;

多字段分组要注意顺序和组合语义

当需要按多个维度分组时,比如GROUP BY a, b,字段的顺序会影响分组的“主次”语义,尽管最终的数据分组结果是一样的。把a放在前面,意味着先按a进行主要分组,再在每个a组内按b细分,这通常和后续的ORDER BY a, b排序逻辑更匹配。

更关键的是,多字段分组会产生笛卡尔式的分组桶。这里有几个常见的“坑”:

  • 别指望GROUP BY gender, city会自动补全所有可能的组合。如果某个城市没有女性用户,那么结果集中就不会出现“该城市-女性”这一行。它只返回实际存在数据的组合。
  • 在做报表时,如果需要展示“所有城市 × 所有性别”的完整矩阵(即使计数为0),光靠GROUP BY是做不到的。通常的解决方案是用CROSS JOIN生成所有组合,再通过LEFT JOIN关联实际数据来统计。
  • 注意字段的一致性。如果city字段是VARCHAR类型,里面混有尾部空格或者大小写不一致(比如‘Beijing ’‘beijing’),它们会被当成两个完全不同的组,这往往是数据清洗不到位导致的。

NULL 值在 GROUP BY 中被当作同一组处理

这个特性非常关键,却容易被忽略:在分组时,所有的NULL值会被视为彼此相等,从而归入同一个组。举个例子,执行SELECT department, COUNT(*) FROM staff GROUP BY department,所有部门为NULL的员工记录会被合并成一行,在结果中department列显示为NULL

如果你需要区分“部门明确为空”和“部门信息未录入”这两种情况,就必须在分组前对数据进行处理:

  • 使用CASE表达式:CASE WHEN department IS NULL THEN ‘UNKNOWN’ ELSE department END,将NULL转换成一个有意义的标记再分组。
  • 或者使用COALESCE(department, ‘MISSING’)函数,达到同样的效果。
  • 需要特别提醒的是:GROUP BY会把所有NULL分到一组,但空字符串‘’NULL是两种不同的值,它们会被分到不同的组里。

理解这个行为对于数据质量检查至关重要。报表里那个“NULL组”的数量,很可能掩盖了背后多种原因造成的脏数据问题,需要你进一步下钻分析。

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

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

同类文章
更多
SQL如何调试复杂的嵌套查询_利用EXPLAIN分析执行路径

SQL如何调试复杂的嵌套查询_利用EXPLAIN分析执行路径

SQL如何调试复杂的嵌套查询:利用EXPLAIN分析执行路径 调试复杂SQL,尤其是嵌套查询,最怕的就是面对执行计划一头雾水。其实,读懂EXPLAIN的输出,关键在于理解优化器背后的权衡逻辑,而不是死记硬背几个术语。下面这几个常见的执行计划“疑点”,就是很好的切入点。 EXPLAIN 看不懂执行计划

时间:2026-04-25 22:54
mysql如何将时间戳转为日期_使用from unix time函数转换

mysql如何将时间戳转为日期_使用from unix time函数转换

MySQL中FROM_UNIXTIME()转换时间戳需注意时区、引号、NULL及类型溢出 在MySQL数据库操作中,将时间戳转换为可读日期是常见需求,FROM_UNIXTIME()函数是实现这一功能的核心工具。然而,实际应用中存在四个关键细节极易被忽视,直接影响数据准确性:必须使用 +08:00 格

时间:2026-04-25 22:53
mysql如何将表定义转化为JSON格式_数据库结构文档化技巧

mysql如何将表定义转化为JSON格式_数据库结构文档化技巧

MySQL表结构转JSON:避开常见陷阱,实现高效文档化方案 你是否需要将MySQL的表定义转换为一份清晰、可直接使用的JSON文档?这项工作听起来简单,但实际操作中,直接解析SHOW CREATE TABLE命令的输出会遇到格式不统一的问题,容易出错。有没有更稳定可靠的方法?答案是肯定的。 利用

时间:2026-04-25 22:53
SQL如何高效合并两个结构相似的表_使用UNION_ALL代替不必要的JOIN

SQL如何高效合并两个结构相似的表_使用UNION_ALL代替不必要的JOIN

SQL如何高效合并两个结构相似的表:使用UNION ALL代替不必要的JOIN 想把两个结构相似的表合并起来,你首先想到的是不是JOIN?其实,在很多场景下,UNION ALL才是那个更直接、更高效的选择。关键在于,你得先搞清楚自己的目标:是要把数据“纵向堆叠”起来,还是要“横向关联”起来。前者是U

时间:2026-04-25 22:53
mysql如何定期清理过期测试数据_mysql数据生命周期管理

mysql如何定期清理过期测试数据_mysql数据生命周期管理

MySQL测试数据清理:从“能删”到“会删”的四个关键步骤 清理数据库中的过期测试数据,看似是一项基础的运维任务,实则蕴含着诸多技术细节与风险考量。直接执行DELETE语句固然简单,但如何高效、安全、可控地完成清理,才是衡量专业度的关键。 用 DELETE + WHERE 清理过期测试数据最直接,但

时间:2026-04-25 22:53
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程