首页 游戏 软件 资讯 排行榜 专题
首页
数据库
SQL如何对数据进行分组统计?GROUP BY聚合函数应用

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

热心网友
62
转载
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如何对数据进行分组统计?GROUP BY聚合函数应用
数据库
SQL如何对数据进行分组统计?GROUP BY聚合函数应用

SQL如何对数据进行分组统计?GROUP BY聚合函数应用 说到数据分组统计,GROUP BY绝对是绕不开的核心。但你真的用对了吗?先记住一个核心原则:GROUP BY必须与聚合函数配合使用,非聚合字段须出现在GROUP BY子句中或包裹于聚合函数内;HA VING用于分组后过滤,WHERE用于分组

热心网友
04.25
SQL如何通过嵌套查询实现多维数据分析_嵌套GROUPING SETS
数据库
SQL如何通过嵌套查询实现多维数据分析_嵌套GROUPING SETS

SQL如何通过嵌套查询实现多维数据分析:嵌套GROUPING SETS的实战拆解 直接说结论:GROUPING SETS 本身不支持语法上的嵌套。但别急,这并不意味着你实现不了类似“嵌套”的多维分析需求。关键在于转换思路:用子查询做预处理,再用GROUPING SETS做汇总。这本质上是一种“分步聚

热心网友
04.25
SQL怎样实现多列组合分组查询_深入理解GROUP BY多字段逻辑
数据库
SQL怎样实现多列组合分组查询_深入理解GROUP BY多字段逻辑

GROUP BY 多字段:从“分组”到“定义新维度”的深度解析 GROUP BY 多字段的执行逻辑到底是什么 很多朋友对 GROUP BY a, b 有个常见的误解,以为它是先按 a 分大组,再在每个大组里按 b 分小组。其实不然,数据库的处理方式要更直接:它把 (a, b) 这个组合,当作一个**

热心网友
04.24
SQL如何在GROUP BY中按特定顺序排序_结合CASE WHEN表达式
数据库
SQL如何在GROUP BY中按特定顺序排序_结合CASE WHEN表达式

GROUP BY不控制顺序,必须用ORDER BY配合CASE WHEN实现自定义排序 GROUP BY本身不控制结果顺序,必须配ORDER BY 这里有个常见的误解:不少人觉得,只要写了 GROUP BY column,结果就会自动按这个字段的顺序排列。其实不然——GROUP BY 的职责仅仅是逻

热心网友
04.23
SQL解决GROUP BY后的乱码问题_检查字符集编码
数据库
SQL解决GROUP BY后的乱码问题_检查字符集编码

GROUP BY 乱码本质是字符集不匹配所致,需统一数据库、连接、表字段、校对规则、驱动及输出环节的 utf8mb4 编码与 utf8mb4_unicode_ci 校对。 GROUP BY 结果出现乱码,先查数据库和连接的字符集是否一致 首先得明确一点:乱码这事儿,GROUP BY 本身可不背锅。它

热心网友
04.23

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

COD救不了XGP!分析师早已预料到降价:毫不意外
游戏评测
COD救不了XGP!分析师早已预料到降价:毫不意外

微软调整XGP战略:降价与《使命召唤》延期入库的背后 最近游戏圈有个大消息:微软宣布下调Xbox Game Pass Ultimate和PC Game Pass的月度订阅价格。具体来看,Ultimate档位从每月29 99美元降到了22 99美元,PC Game Pass则从16 49美元降至13

热心网友
04.25
XGP迎重大变革!降价还没完 还有“自选套餐”模式
游戏评测
XGP迎重大变革!降价还没完 还有“自选套餐”模式

2026年,Xbox新掌门的第一把火:Game Pass要变“自助餐”了 2026年2月,阿莎·夏尔马接棒菲尔·斯宾塞,成为Xbox的新任CEO。这位新官上任,动作可谓雷厉风行。就在昨天,她点燃了第一把火:Xbox Game Pass Ultimate的月费,从29 99美元直接降到了22 99美元

热心网友
04.25
《AC起源》男主劝退
游戏评测
《AC起源》男主劝退"乔尔"演员做游戏:这行太残酷!

当明星演员想开游戏工作室:资深同行为何直言“别这么做”? 最近,游戏圈里发生了一场有趣的隔空对话。为《最后生还者》《死亡搁浅》等大作献声的知名演员特洛伊·贝克,在采访中透露了一个雄心勃勃的计划:他想创立自己的游戏工作室,去讲述“自己的故事”。他甚至提到,自己的灵感来源之一,正是曾为《刺客信条:起源》

热心网友
04.25
突发!Steam新手柄售价曝光:评测已偷跑!
游戏评测
突发!Steam新手柄售价曝光:评测已偷跑!

Steam新款手柄评测视频意外流出,定价信息同步曝光 游戏硬件圈最近有个不大不小的“意外”。根据海外多个科技消息源的报道,Valve即将推出的新款Steam Controller手柄,其评测视频竟然提前在网上泄露了。更关键的是,视频里还直接公布了这款产品的售价:99美元。 事情是这样的:一个名为“T

热心网友
04.25
索尼新规主机断网不让玩:内部人士回应了!
游戏评测
索尼新规主机断网不让玩:内部人士回应了!

此前,外网消息源透露,目前PlayStation在PS4和PS5的数字版游戏中加入了DRM验证(正版在线验证)机制。 前情提要>> 简单来说,这个新机制的效果是这样的:从今往后,如果你通过数字商店购买新游戏,那么主机就必须定期连接到PSN网络进行正版验证。具体规则是,如果主机连续超过30天处于离线状

热心网友
04.25