1. SELECT语句顺序
注意:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前,即也在having之前。
3.where后的条件表达式里不允许使用聚合函数,而having可以。
4.having后只能跟group by后边字段条件 或者 非group by字段的聚合函数条件(按组查询)。
2. group by rollup
rollup:归纳,汇总
分组的种类数为:rollup后面的字段数 + 1
Group by rollup(A,B,C,D….)
1.group by null
2.group by A
3.group by A,B
4.group by A,B,C
5.group by A,B,C,D
- ….
ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。
3. group by cube
Cube:多维数据集
分组的种类数为: 四种结果的并集n为:cube括号里面的字段数
如:Group by rollup(A,B,C),首先会产生8个分组,分别为:
1.group by null,即,只统计数据,没有进行分组
2.group by A,即,只按照A进行分组
3.group by B,即,只按照B进行分组
4.group by C,即,只按照C进行分组
5.group by A,C,即,按照A,C进行分组
6.group by A,B,即,按照A,B进行分组
7.group by B,C,即,按照B,C进行分组
8.group by A,B,C,即,相当于没写cube
4. GROUPING
GROUPING()函数只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不为空则返回0,如果为空则返回
5. GROUPING_ID()
GROUPING_ID()配合GROUPING()函数使用,GROUPING_ID(A,B)的值由GROUPING(A)与GROUPING(B)的值决定,如果GROUPING(A)为1,GROUPING(B)为0,则GROUPING_ID(A,B)的值为 10,十进制的 3.
有了GROUPING_ID列,我们就可以使用 HAVING 字句来对查询结果进行过滤。选择GROUPING_ID=0的就表示 FACTORY,DEPARTMENT两列都不为空。
6. group by grouping sets
Grouping sets:分组设置/集。
理解:先按照一定的规则产生多种分组,然后按照各组统计数据
分组的种类数为:grouping sets括号里面的字段数
Group by grouping sets(A,B,C,D….)
1.group by A
2.group by B
3.group by C
4.group by D
5. ….
每一组分组的种类数为:同rollup
案例
SELECT * FROM TEST_PRODUCTION;
(1) 单列分组
SELECT FACTORY,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY FACTORY;
SELECT FACTORY,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY);
SELECT FACTORY,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY CUBE(FACTORY);
(2) 两列分组
SELECT FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY, DEPARTMENT)
ORDER BY FACTORY
如果 ROLLUP(A,B)则先对 A,B进行 GROUP BY,之后对 A 进行 GROUP BY,最后对全表 GROUP BY。
如果 ROLLUP(A,B,C)则先对 A,B,C进行 GROUP BY ,然后对 A,B进行GROUP BY,再对 A 进行GROUP BY,最后对全表进行 GROUP BY.
SELECT FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY CUBE(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
可以看出来首先对 FACTORY,DEPARTMENT进行分组汇总,然后对FACTORY 分组汇总,之后对 DEPARTMENT 分组汇总,最后有一行全表汇总。
SELECT GROUPING(FACTORY),FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
SELECT FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY GROUPING SETS(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
SELECT GROUPING(FACTORY),GROUPING(DEPARTMENT),GROUPING_ID(FACTORY,DEPARTMENT),FACTORY,DEPARTMENT,SUM(QUANTITY) FROM TEST_PRODUCTION
GROUP BY ROLLUP(FACTORY, DEPARTMENT)
ORDER BY FACTORY,DEPARTMENT
————————————————
参考链接:
https://blog.csdn.net/the_best_hacker/article/details/92784204
https://blog.csdn.net/tom_tom_tom_xiang/article/details/78188617