Group By 谁不会啊?这不是最简单的吗?越是简单的东西,咱们越会忽略掉他,由于咱们不肯意再去深刻了解它。
1 小时 SQL 极速入门(一)
1 小时 SQL 极速入门(二)
1 小时 SQL 极速入门(三)——Oracle 分析函数
SQL 高级查询——(层次化查询,递归)sql
今天就带你们了解一下Group By 的新用法吧。segmentfault
ROLL UP 搭配 GROUP BY 使用,能够为每个分组返回一个小计行,为全部分组返回一个总计行。函数
直接看例子,咱们有如下数据表,包含工厂列,班组列,数量列三列。spa
当向 ROLLUP 传入一列时,会获得一个总计行。code
SELECT factory, SUM(quantity) FROM production GROUP BY ROLLUP(factory) ORDER BY factory
结果:递归
当向 ROLLUP 传递两列时,将会按照这两列进行分组,同时按照第一列的分组结果返回小计行。咱们同时传入工厂和部门看一下。get
SELECT factory,department, SUM(quantity) FROM production GROUP BY ROLLUP(factory, department) ORDER BY factory
结果:it
能够看到对每个工厂都有一个小计行,最后对全部的有一个总计行。也能够这样理解 io
若是 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.
CUBE 和 ROLLUP 对参数的处理是不一样的,咱们能够这样理解。
若是 CUBE(A,B)则先对 A,B 进行 GROUP BY,以后对 A 进行 GROUP BY,而后对 B 进行 GROUP BY,最后对全表进行 GROUP BY.
若是 CUBE(A,B,C)则先对 A,B,C 进行 GROUP BY,以后对 A,B ,以后对A,C ,以后对 B,C 以后对 A,以后对 B,以后对 C,最后对全表GROUP BY
看一个简单的例子:
SELECT factory,department, SUM(quantity) FROM production GROUP BY CUBE(factory, department) ORDER BY factory,department;
结果:
能够看出来首先对 FACTORY,DEPARTMENT进行分组汇总,而后对FACTORY 分组汇总,以后对 DEPARTMENT 分组汇总,最后有一行全表汇总。
GROUPING()函数只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,若是此列不为空则返回0,若是为空则返回1.
咱们用第一个ROLLUP例子举例
SELECT GROUPING(factory), factory, department, SUM(quantity) FROM production GROUP BY ROLLUP(factory, department) ORDER BY factory, department;
结果:
看到,最后一行的 FACTORY 为空,因此 GROUPING()返回 1.也能够与CUBE结合使用,方法是同样的。
GROUPING SETS 与 CUBE 有点相似,CUBE是对参数进行自由组合进行分组。GROUPING SETS则对每一个参数分别进行分组,GROUPING SETS(A,B)就表明先按照 A 分组,再按照 B分组。
SELECT factory, department, SUM(quantity) FROM production GROUP BY GROUPING SETS(factory, department) ORDER BY factory, department
结果:
能够看出来结果是按照工厂和部门分别分组汇总的。
GROUPING_ID()配合GROUPING()函数使用,GROUPING_ID(A,B)的值由GROUPING(A)与GROUPING(B)的值决定,若是GROUPING(A)为1,GROUPING(B)为0,则GROUPING_ID(A,B)的值为 10,十进制的 3.
SELECT factory, department, GROUPING(factory), GROUPING(department), GROUPING_ID(factory,department), SUM(quantity) FROM production GROUP BY CUBE(factory, department) ORDER BY factory, department;
结果:
有了GROUPING_ID列,咱们就可使用 HAVING 字句来对查询结果进行过滤。选择GROUPING_ID=0的就表示 FACTORY,DEPARTMENT两列都不为空。