MySQL 8.4.3 引入 GROUP BY ROLLUP 语法
本期内容以最新版本 MySQL 8.4.8 为例,介绍 8.4 系列的新特性。
MySQL 8.4.3 中新增替代语法
MySQL 8.4.3 引入了与 Oracle、SQL Server、PostgreSQL 等数据库兼容的 ROLLUP 语法形式:
1 | -- 传统语法(仍支持) |
测试用例:
1 | -- 1. 创建测试表 |
测试结果:
1 | mysql> select version()\G |
结果包含以下三个层级的聚合:
- 明细层级:每个国家、每年的利润总和。
- 小计层级:每年的全球总利润(此时 country 列显示为 NULL)。
- 总计层级:所有年份、所有国家的总利润(此时 year 和 country 均显示为 NULL)。
02. WITH ROLLUP 的适用场景
无论使用哪种语法,ROLLUP 的核心价值在于单次查询生成多级聚合报表:
1. 财务报表与 OLAP 分析
生成分层小计(Subtotal)和总计(Grand Total),无需 UNION ALL:
1 | mysql> SELECT |
2. 数据仓库 ETL 与报表生成
配合 GROUPING() 函数(返回 1 表示 ROLLUP 生成的聚合行,0 表示原始数据行),可标记汇总行类型:
1 | mysql> INSERT INTO sales (year, country, product, profit) VALUES |
3. 多级维度分析
支持任意层级的维度组合,例如按年、季、月分析销售趋势:
1 | mysql> SELECT |
03. MySQL 8.4.3 版本的相关修复
除语法增强外,8.4.3 及后续版本还修复了多个 WITH ROLLUP 相关的稳定性问题 :
- 聚合函数与 ROLLUP 的交互:修复了包含聚合函数(如
COUNT())且同时出现在ORDER BY中的 ROLLUP 查询可能导致服务器异常退出的问题 - 子查询兼容性:修复了子查询中包含
WITH ROLLUP时处理不正确的问题 - 窗口函数结合:修复了
RANK()...OVER()与 ROLLUP 结合时的断言失败问题
04. 使用建议
- 新项目:建议使用 8.4.3+ 的新语法
GROUP BY ROLLUP (...),更易读且符合 SQL 标准 - 旧项目迁移:传统
WITH ROLLUP语法仍完全支持,无需强制修改 - 复杂报表:结合
GROUPING()函数和COALESCE()/IF()对 NULL 值进行标签化处理,提升报表可读性
Have a nice day ~ ☕
🌻 近期内容 ▼
- Oracle Skills开源:AI工程正在进入"技能时代"
- 苦等三年!Oracle AI Database 26ai本地服务器版终于来了
- MySQL 8.0结束生命周期,8.4.9 LTS、9.7.0发版上线:一个时代的交接与新生
👉 这里有得聊
如果对国产基础软件(操作系统、数据库、中间件)、AI、Vibe Coding、OpenClaw 、Hermes Agent 等感兴趣,可以加群一起聊聊。关注微信公众号:(少安事务所),后台回复[群],即可看到入口。如果这篇文章为你带来了灵感或启发,请帮忙『点赞、推荐、转发』吧,感谢!ღ( ´・ᴗ・` )~
Author: Shawn Yan
Link: https://shawnyan.cn/2026/mysql/mysql-8-4-3-introduce-group-by-rollup/index.html
License: All articles on this site are original unless otherwise stated. Please indicate the source when reprinting!