
MySQL 8.0 新增了 GROUPING() 函数,用来理清 GROUP BY with rollup 子句检索后所产生的每个分组汇总结果。 grouping 可用在分组列,having 子句以及 order by 子句。
GROUPING() 函数用来返回每个分组是否为 ROLLUP 结果,是为 1 否为 0。从结果中,很容易就能区分哪些 NULL 是正常记录,哪些是 ROLLUP 的结果。
GROUPING() 函数不仅仅是针对单个字段来统计汇总值,还可以针对多个字段。
此时会发现,GROUPING() 函数对多个字段结果并非只有 1 和 0,还有一个值为 3。在 GROUPING() 函数包含多个参数时,按照以下方式来返回结果:
GROUPING(r1,r2) 等价于 GROUPING(r2) + GROUPING(r1) <<1
GROUPING(r1,r2,r3,...) 等价于 GROUPING(r3) + GROUPING(r2) <<1 + GROUPING(r1) <<2
以此类推
GROUPING 语句还可以用在 HAVING 子句里,比如用 GROUPING 子句来过滤掉非 ROLLUP 的结果。
sql中GROUPING用于区分标准空值和由 ROLLUP、CUBE 或 GROUPING SETS 返回的空值。作为 ROLLUP、CUBE 或 GROUPING SETS *** 作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,表示全体。
扩展资料:
grouping sets是等价于带union all的group by子句,之所以是等价而不是等于,是因为它们的顺序不一样。grouping sets并不只是group by的语法糖,这两者内部的执行过程也是全然不同的,性能方面grouping sets能减少IO *** 作但会增加CPU占用时间。
另外在grouping sets中如果将括号中的参数换个位置那么结果也将改变,这说明结果集中的顺序与参数的位置也有关。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)