分组原理(GROUP BY子句)2:GROUPING SETS选项(分组集)

分组原理(GROUP BY子句)2:GROUPING SETS选项(分组集)

若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社出版,作者 黄勇,网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

二、GROUPING SETS选项(分组集)
1、分组集就是把GROUP BY分组后得到的所有分组作为一个集合,也就是说,分组集是分组的集合,因此如下语句的分组仅得到一个分组集,即由列a和b分组后得到的所有分组所组成的集合,可简记为(a, b),注意:(a, b)表示的是一个集合,其元素是使用列a和b分组后得到的分组,若把(a, b)使用一个字母比如A或B来代表分组集可能更容易理解。

SELECT a,b FROM T3 GROUP BY a,b

同理,使用如下语句将得到两个分组集

SELECT a,b FROM T4 GROUP BY a,b		--分组集1
SELECT a,c FROM T4 GROUP BY a,c		--分组集2

2、使用GROUPINGS SETS选项可把多个分组集合并在一起,其效果是把多个含有相应分组集的结果集使用UNION ALL运算符进行合并,比如以下示例中的语句1与语句2是等效的,其输出结果见图XXX

示例5.05:分组集(GROUPING SETS选项)原理
SELECT a,b,c FROM T4 GROUP BY GROUPING SETS(    --语句1
(a,b),			--分组集1:(a,b),把每个分组集使用括号括起来并使用逗号隔开
(a,c) )		--分组集2:(a,c)
/*由于UNION ALL要求所有查询的结果集包含相同的列数,所以以下语句使用NULL作为占位符,以对查询结果的列进行调整*/
SELECT a,NULL AS b,c FROM T4 GROUP BY a,c		--语句2,等效于语句1
UNION ALL
SELECT a,b,NULL AS c FROM T4 GROUP BY a,b

在这里插入图片描述

3、注意:省略GROUPING SETS内层的括号得到的将是分别由各个元素组成的单个分组集,比如GROUPING SETS(a, b, c)相当于定义了3个分组集,而GROUPING SETS( (a, b, c) )则只定义了一个分组集
4、使用GROUPINGS SETS选项与使用UNION ALL合并分组集的优缺点
使用UNION ALL合并分组集的缺点是代码太长并且性能比较低下,因为每一个查询都会分别单独扫描一次源表,所以性能比较低下。使用GROUPINGS SETS选项合并分组集可明显减少代码长度,并且能够优化扫描源表的次数,不必为每个分组集单独对表源进行扫描,从而提高性能。
5、在同一个GROUP BY子句中,也可以使用逗号分隔的多个GROUPING SETS子句,比如,

GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)	

该语句的规则,详见后文。

三、( )选项
1、( )选项表示不对当前表进行分组,通常用于生成一个类似于ROLLUP进行“总计(或汇总)”功能的NULL组,()不能用于ROLLUP和CUBE子句中,通常将()用于不含ROLLUP或CUBE子句的GROUPING SETS选项中用于进行类似“总计”功能的计算
在这里插入图片描述

作者:黄邦勇帅(原名:黄勇)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hyongilfmmm/article/details/93891699