`

Oracle高级查询之GROUP BY

 
阅读更多

开篇一笑:两个男人在饭店里边吃饭边聊天,甲:“我不得不在这儿吃饭,因为我妻子不想做饭。”乙:“您真幸运,我之所在这吃饭,是因为我妻子一定要做饭。”


为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。
现在客户的需求是统计部门中每种工作的工资总额,最后还需要统计所有人的工资总数,相信这样的需求对大家来说还是比较简单的,很快就能写出SQL语句,如下:

  1. selectdeptno,job,sum(sal)
  2. fromscott.emp
  3. groupbydeptno,job
  4. orderbydeptno
  5. unionall
  6. selectnulldeptno,nulljob,sum(sal)fromscott.emp;
客户拍了一下脑袋瓜(当成西瓜拍了),再统计每个部门的工资数吧。tnnd,我加一个union all搞定,修改后的SQL语句如下:
  1. selectdeptno,job,sum(sal)
  2. fromscott.emp
  3. groupbydeptno,job
  4. unionall
  5. selectdeptno,nulljob,sum(sal)
  6. fromscott.emp
  7. groupbydeptno
  8. unionall
  9. selectnulldeptno,nulljob,sum(sal)fromscott.emp;
老师批注:为什么要写的这么啰嗦呢?其实有更简介的语句可以实现同样的功能,看好了:
  1. selectdeptno,job,sum(sal)fromscott.empgroupbyrollup(deptno,job);
客户的需求就好像肾虚的人尿频一样(谁说客户是上帝,上帝哪来那么多的需求?),再统计每个工作类型的工资总额吧。tnnd,我再加一个union all再搞定,修改后的SQL语句如下:
  1. selectdeptno,job,sum(sal)
  2. fromscott.emp
  3. groupbydeptno,job
  4. unionall
  5. selectdeptno,nulljob,sum(sal)
  6. fromscott.emp
  7. groupbydeptno
  8. unionall
  9. selectnulldeptno,job,sum(sal)
  10. fromscott.emp
  11. groupbyjob
  12. unionall
  13. selectnulldeptno,nulljob,sum(sal)fromscott.emp;
老师再批注:老师在讲你有没有在听,根本就没有在听嘛!再教你一个简洁的SQL语句,请看:
  1. selectgrouping(job),deptno,job,sum(sal)
  2. fromscott.emp
  3. groupbycube(deptno,job)
  4. orderbydeptno;
客户想了想说,只要统计部门工资总额和工作类型工资总额就可以了(我每天都徘徊在杀人和忍住不杀之间),我fucking减掉一个union all搞定,修改后的SQL语句如下:
  1. selectnulldeptno,job,sum(sal)
  2. fromscott.emp
  3. groupbyjob
  4. unionall
  5. selectdeptno,nulljob,sum(sal)fromscott.empgroupbydeptno;
老师再再批注:你小子算是彻底没救了,但我是老师啊,决不放弃任何一个学生。再再教你最后一招,仔细看下面:
  1. selectgrouping(deptno),grouping(job),grouping_id(job),deptno,job,sum(sal)
  2. fromscott.emp
  3. groupbygroupingsets(deptno,job);
忙活半天总算把客户的需求都满足了,稍微松了一口气,不过既然学到新东西,我们有必要最后总结一下。

GROUP BY ROLLUP(A,B,C):首先对(A,B,C)进行GROUP BY,然后对(A,B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
GROUP BY CUBE(A,B,C):首先对(A,B,C)进行GROUP BY,然后依次对(A,B)、(A,C)、(A)、(B,C)、(B)、(C)进行GROUP BY,最后对全表进行GROUP BY操作。
GROUP BY GROUPING SETS(A,B,C):依次对(C)、(B)、(A)进行GROUP BY。
分享到:
评论

相关推荐

    Oracle高级sql学习与练习

    10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、PARITION分区 16、并行操作 17、扩展DDL和DML语句 18、MODEL语句 19、10G闪回查询 20、专题-...

    Oracle SQL高级编程

    1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    3 Enhancements to the GROUP BY Clause Objectives 3-2 Review of Group Functions 3-3 Review of the GROUP BY Clause 3-4 Review of the HAVING Clause 3-5 GROUP BY with ROLLUP and CUBE Operators 3-6 ROLLUP ...

    剑破冰山++Oracle开发艺术[1].part10

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    oracle学习笔记(txt格式,自己总结的,很详细,每章附有例题和习题及答案)

    oracle学习笔记,txt格式,完全是自己总结的,特别详细,有例子,还有练习题以及答案。包括1.基本SQL语句 2....增强GROUP BY子句 16.高级子查询 17.分级取回数据 18.oracle9i对DML和DDL语句的扩展。

    oracle公司内部的培训资料

    Les01 : 基本SQL SELECT语句 Les02 : 过滤和排序数据[where / order by] ...Les17 : 对 GROUP BY 子句的扩展 Les18 : 高级子查询 Les19 : Oracle9i 对 DML 和 DDL 语句的扩展 Les20 : 对 DML 和 DDL 语句的扩展

    oracle分组排序统计高级用法

    oracle如何实现分组排序和统计、聚集,如何分组求top N,什么是over分析函数,row_number(),rank(),dense_rank()区别又是什么, 如何找到一条记录的前后值,这份文档写得太好了。

    剑破冰山++Oracle开发艺术[1].part01

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part07

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part04

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part02

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part03

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part08

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part06

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part09

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    剑破冰山++Oracle开发艺术[1].part05

    数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归WITH编程、动态SQL扩展。此外还有大量案例...

    Oracle公司内部数据库培训中文PPT资料

    Les01 基本SQL SELECT语句.ppt Les02 过滤和排序数据.ppt Les03 单行函数.ppt ... Les17 对 GROUP BY 子句的扩展 .ppt Les18 高级子查询.ppt Les19 分级查询.ppt Les20 DML 和 DDL 语句的扩展.ppt

Global site tag (gtag.js) - Google Analytics