增强group by

总结:
1.提示当使用group by时,未在group by部分用到的表列在select部分出现时必须使用分组函数。
2.having子句允许用户指定对一个记录组的搜索条件。而通常的where查询条件只针对单记录,不针对记录组。
3.在Group By子句中,必须采用表达式的全称,而不能够采用其别名.
4.采用Group语句会自动对纪录进行排序。在使用Order By排序子句对统计结果进行重新排序的时候,要慎重。
5.如果想把某个字段当作第一顺序排序的话,则只需要把这个字段放置在分组语句中的第一个参数即可。

 

示例:

[java]  view plain copy print ?
  1. --聚合函数,不能出现在where子句中,比如where avg(salary)>4000  
  2. select t.deptno,sum(t.sal) from emp t group by t.deptno having sum(t.sal)>9000;  
  3.   
  4. DEPTNO SUM(T.SAL)  
  5. ------ ----------  
  6.     30       9400  
  7.     20      10875  



[java]  view plain copy print ?
  1. --查出表中name重复大于10条的记录  
  2. select name from test group by name having count(*)>10;  



[java]  view plain copy print ?
  1. --Rollup分组产生的结果集包含常规的分组和小计行。在生成包含小计和合计的报表时,ROLLUP 运算符很有用。  
  2. --使用grouping函数标识rollup或者cube创建的行  
  3. --用GROUPING函数模拟能够发现在一行中的构成小计的分组,返回0或者1。  
  4. --GROUPING函数返回0意味着下列情况:这个表达式包含在小计中.  
  5. --GROUPING函数返回1意味着下列情况:这个表达式没有包含在小计中.  
  6. select decode(grouping(t.deptno),1,'10/20/30',t.deptno) deptno,  
  7.        case  
  8.          when grouping(t.ename)=1 and grouping(t.deptno)=0 then '小计'  
  9.          when grouping(t.ename)=1 and grouping(t.deptno)=1 then '合计'  
  10.          else t.ename  
  11.        end ename,  
  12.        sum(t.sal) sal   
  13. from emp t group by rollup(t.deptno,t.ename);  
  14.   
  15. DEPTNO                                   ENAME             SAL  
  16. ---------------------------------------- ---------- ----------  
  17. 10                                       KING             5000  
  18. 10                                       CLARK            2450  
  19. 10                                       MILLER           1300  
  20. 10                                       小计             8750  
  21. 20                                       FORD             3000  
  22. 20                                       ADAMS            1100  
  23. 20                                       JONES            2975  
  24. 20                                       SCOTT            3000  
  25. 20                                       SMITH             800  
  26. 20                                       小计            10875  
  27. 30                                       WARD             1250  
  28. 30                                       ALLEN            1600  
  29. 30                                       BLAKE            2850  
  30. 30                                       JAMES             950  
  31. 30                                       MARTIN           1250  
  32. 30                                       TURNER           1500  
  33. 30                                       小计             9400  
  34. 10/20/30                                 合计            29025  


 


[java]  view plain copy print ?
  1. --Cube操作依据条件中列的所有可能组合情况进行分组,并对每一个分组返回一行汇总。CUBE是一个类似ROLLUP的扩展,使得可以用一个语句计算所有可能的聚合。  
  2. select t.deptno,sum(t.sal) sal from emp t group by cube (t.deptno);  
  3.   
  4. DEPTNO        SAL  
  5. ------ ----------  
  6.             29025  
  7.     10       8750  
  8.     20      10875  
  9.     30       9400  



[java]  view plain copy print ?
  1. --使用grouping sets产生一个单独的结果集(等价于union all的方式)  
  2. --GROUPING SETS是GROUP BY子句的扩展,可以在一个查询中定义多个组。  
  3. --Oracle服务器计算所有在GROUPING SETS子句中指定的组,并且把每个单独的组产生的结果进行UNION ALL操作。  
  4. --GROUPING SET的效率:只需要一次全表扫描,不需要写复杂的UNION语句,同时GROUPING SETS子句中含有的元素越多,得到的性能增益越大。  
  5. select t.deptno,t.ename,t.job from emp t group by grouping sets((t.deptno,t.ename),(t.deptno,t.job));  
  6.   
  7. DEPTNO ENAME      JOB  
  8. ------ ---------- ---------  
  9.     20 JONES        
  10.     30 WARD         
  11.     20 SCOTT        
  12.     10 KING         
  13.     30 JAMES        
  14.     30 ALLEN        
  15.     30 MARTIN       
  16.     30 BLAKE        
  17.     20 FORD         
  18.     20 SMITH        
  19.     20 ADAMS        
  20.     10 MILLER       
  21.     10 CLARK        
  22.     30 TURNER       
  23.     20            CLERK  
  24.     30            SALESMAN  
  25.     20            MANAGER  
  26.     30            CLERK  
  27.     10            PRESIDENT  
  28.     30            MANAGER  
  29.     10            CLERK  
  30.     10            MANAGER  
  31.     20            ANALYST  
  32.       
  33. select t.deptno,t.ename from emp t group by (t.deptno,t.ename);  
  34.   
  35. DEPTNO ENAME  
  36. ------ ----------  
  37.     20 JONES  
  38.     30 WARD  
  39.     20 SCOTT  
  40.     10 KING  
  41.     30 JAMES  
  42.     30 ALLEN  
  43.     30 MARTIN  
  44.     30 BLAKE  
  45.     20 FORD  
  46.     20 SMITH  
  47.     20 ADAMS  
  48.     10 MILLER  
  49.     10 CLARK  
  50.     30 TURNER  
  51.   
  52. select t.deptno,t.job from emp t group by (t.deptno,t.job);  
  53.   
  54. DEPTNO JOB  
  55. ------ ---------  
  56.     20 CLERK  
  57.     30 SALESMAN  
  58.     20 MANAGER  
  59.     30 CLERK  
  60.     10 PRESIDENT  
  61.     30 MANAGER  
  62.     10 CLERK  
  63.     10 MANAGER  
  64.     20 ANALYST  


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29096438/viewspace-1470151/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29096438/viewspace-1470151/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值