`

Oracle高级查询之GROUP BY

    博客分类:
  • db
 
阅读更多

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

 


 

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

 

  1. select deptno, job, sum(sal)  
  2.   from scott.emp  
  3.  group by deptno, job  
  4.  order by deptno  
  5. union all  
  6. select null deptno, null job, sum(sal) from scott.emp;  

客户拍了一下脑袋瓜(当成西瓜拍了),再统计每个部门的工资数吧。tnnd,我加一个union all搞定,修改后的SQL语句如下:

  1. select deptno, job, sum(sal)  
  2.   from scott.emp  
  3.  group by deptno, job  
  4. union all  
  5. select deptno, null job, sum(sal)  
  6.   from scott.emp  
  7.  group by deptno  
  8. union all  
  9. select null deptno, null job, sum(sal) from scott.emp;  

老师批注:为什么要写的这么啰嗦呢?其实有更简介的语句可以实现同样的功能,看好了:

  1. select deptno, job, sum(sal) from scott.emp group by rollup(deptno, job);  

客户的需求就好像肾虚的人尿频一样(谁说客户是上帝,上帝哪来那么多的需求?),再统计每个工作类型的工资总额吧。tnnd,我再加一个union all再搞定,修改后的SQL语句如下:

  1. select deptno, job, sum(sal)  
  2.   from scott.emp  
  3.  group by deptno, job  
  4. union all  
  5. select deptno, null job, sum(sal)  
  6.   from scott.emp  
  7.  group by deptno  
  8. union all  
  9. select null deptno, job, sum(sal)  
  10.   from scott.emp  
  11.  group by job  
  12. union all  
  13. select null deptno, null job, sum(sal) from scott.emp;  

老师再批注:老师在讲你有没有在听,根本就没有在听嘛!再教你一个简洁的SQL语句,请看:

  1. select grouping(job),deptno, job, sum(sal)  
  2.   from scott.emp  
  3.  group by cube(deptno, job)  
  4.  order by deptno;  

客户想了想说,只要统计部门工资总额和工作类型工资总额就可以了(我每天都徘徊在杀人和忍住不杀之间),我fucking减掉一个union all搞定,修改后的SQL语句如下:

  1. select null deptno, job, sum(sal)  
  2.   from scott.emp  
  3.  group by job  
  4. union all  
  5. select deptno, null job, sum(sal) from scott.emp group by deptno;  

老师再再批注:你小子算是彻底没救了,但我是老师啊,决不放弃任何一个学生。再再教你最后一招,仔细看下面:

  1. select grouping(deptno),grouping(job),grouping_id(job), deptno, job, sum(sal)  
  2.   from scott.emp  
  3.  group by grouping sets(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高级查询技巧

    以下是对"Oracle高级查询技巧"的详细阐述。 一、子查询 子查询是嵌套在其他SQL语句中的查询,用于获取主查询所需的值。它可以作为SELECT、FROM或WHERE子句的一部分。例如,你可以使用子查询来找到某个部门薪水最高...

    ORACLE高级技巧高级查询[借鉴].pdf

    以上是Oracle高级查询技巧的一些关键点,熟练掌握这些技巧能显著提升数据库管理效率,优化查询性能,并避免潜在的问题。在实际工作中,根据具体场景灵活运用这些方法,可以极大地提高数据库的维护和使用体验。

    oracle-高级查询

    Oracle 高级查询 Oracle 高级查询是数据库查询的高级技术,涉及到复杂的 SQL 语句和查询优化。以下是 Oracle 高级查询的知识点总结: 1. 分组和聚合函数 在 Oracle 中,分组和聚合函数是高级查询的基础。分组...

    Oracle高级sql学习与练习

    Oracle高级SQL学习与练习涵盖了数据库编程中的一系列高级主题,旨在帮助数据库开发者和管理员提高解决复杂问题的能力。在Oracle数据库系统中,高级SQL技能是进行高效数据管理、查询优化和复杂数据处理的基础。 1. ...

    ORACLE高级查询..各种各样的查法..重基础到深入

    在Oracle数据库中,高级查询是SQL语言的重要组成部分,它涵盖了多表联接、子查询、集合操作、分组与聚合函数、窗口函数等复杂查询技术。以下是对这些知识点的详细说明: 1. **多表联接(JOIN)**:在上述示例中,...

    oracle之查询语句

    这篇博文将深入探讨Oracle SQL查询语句的基础及其高级用法,帮助读者理解如何高效地使用Oracle进行数据查询。 首先,我们从基础开始,SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言。在...

    oracle 查询部分ppt

    在Oracle中,SQL查询的基本结构包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等子句。其中,SELECT用于定义要查询的列,FROM指定要查询的表,WHERE用于设定查询条件,GROUP BY用于数据分组,HAVING用于分组...

    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高级SQL培训与讲解"的学习,读者将掌握如何编写高效、复杂的SQL查询,更好地管理和优化Oracle数据库,提升数据库应用的性能和用户体验。这个教程会详细解析这些概念,并提供实例演示,帮助学习者深入理解...

    Oracle SQL 高级编程 附源码

    Oracle SQL是数据库管理员和开发人员在管理Oracle数据库时...总之,"Oracle SQL 高级编程"涵盖了数据库管理和开发的多个方面,通过学习和实践,你将能够编写出更高效、更灵活的SQL查询,更好地管理和维护Oracle数据库。

    oracle sql 高级编程

    GROUP BY和HAVING子句用于根据一个或多个列对数据进行分组,并结合聚合函数(如COUNT、SUM、AVG、MAX和MIN)进行统计分析。在高级编程中,理解如何利用这些功能进行复杂的数据分析至关重要。 四、窗口函数 窗口函数...

    Oracle高级操作函数学习笔记

    以下是从标题、描述和部分内容中提取的Oracle高级操作函数的知识点。 ### 分支判断函数 #### DECODE函数 DECODE函数是Oracle中的一个条件分支函数,它的功能类似于编程语言中的if-else if-else语句。DECODE函数的...

    Oracle SQL高级编程 中文版

    3. **聚合函数与分组**:GROUP BY、HAVING子句和聚合函数(如COUNT、SUM、AVG、MIN、MAX)是数据分析的基础。书中将深入讲解如何有效地使用这些工具进行数据汇总和分组分析。 4. **窗口函数**:Oracle SQL的窗口...

    oracle 复杂查询语句的使用

    除了子查询和外连接,Oracle还提供了其他高级查询技术,如联接(JOIN)、集合操作(UNION, INTERSECT, EXCEPT)、分组和聚合函数(GROUP BY, HAVING)、窗口函数(OVER())以及带有条件的聚合(FILTER)。...

    order_by_、group_by_、having的用法

    在SQL查询中,`order_by_`、`group_by_`和`having`是三个非常重要的关键字,它们分别用于不同的数据处理操作。 1. `ORDER BY`:此关键字用于对查询结果进行排序,默认是升序(ASC),也可以指定降序(DESC)。在`...

    Oracle多行记录合并

    6. **`MODEL` 指令:** 这是Oracle中的高级SQL特性,可以处理复杂的矩阵运算和数据转换,包括多行记录的合并。使用`MODEL`指令需要对Oracle SQL有深入理解,但能解决一些其他方法无法处理的复杂问题。 在实际应用中...

    oracle group by语句实例测试

    Oracle中的`GROUP BY`语句是SQL查询中的关键部分,用于根据一个或多个列对数据进行分组,以便对每个组执行聚合函数,如`SUM`、`COUNT`、`AVG`等。在本例中,我们看到的`GROUP BY`语句是用来对`test`表中的数据进行...

    Oracle 10g中的高级SQL函数

    `GROUP BY` 和 `HAVING` 子句是SQL中的基础工具,但在Oracle 10g中,你可以使用 `CUBE()`, `ROLLUP()`, `GROUPING SETS()` 进行多维度分析,创建更复杂的分组。`CONNECT BY` 用于构建层次结构,如组织结构或产品分类...

Global site tag (gtag.js) - Google Analytics