oracle 高级查询

7、高级查询
    7.1:UNION ALL:返回查询检索出的所有行,包括重复的行
    7.2:UNION:返回查询检索出的所有非重复行。
    7.3:INTERSECT:返回查询检查出来的共有行。
    7.4:MINUS:返回将第二个查询检索出的行从第一个查询检索出的行中减去之后剩余的行。
    7.5:GROUP BY 之ROLLUP,可以为每个分组返回小计记录以及为所有分组返回总计记录。
         eg:
  select divid,sum(salary) from employee group by divid order by divid;
         DIV  SUM(SALARY)
  ----  ----------
  bus   1610000
  ope   1320000
  sal     4936000
  sup    1015000

  向ROLLUP传递一列
         eg:
  select divid,sum(salary) from employee group by rollup(divid) order by divid;
         DIV  SUM(SALARY)
  ----  ----------
  bus   1610000
  ope   1320000
  sal     4936000
  sup    1015000
            8881000
    
         向ROLLUP传递多列
  eg:
         select divid,jobid,sum(salary) from employee group by rollup(divid,jobid) order by divid,jobid;
  DIV     JOB     SUM(SALARY)
  -----   ------   -------------------
  BUS    MGR    530000
  BUS    PRE      800000
  BUS    WOR    180000
  BUS               1610000
  OPE    ENG      240000
  OPE    MGR      805000
  OPE    WOR      270000
  OPE                 1320000
  SAL     MGR      4446000
  SAL     WOR        490000
  SAL                   1936000
  SUP    MGR         465000
  SUP    TEC           115000
  SUP     WOR         435000
  SUP                     1015000
                            8881000

          修改传递给ROLLUP的列的位置,则会得到以jobid为准的一组数字统计

    7.6:GROUP BY 之CUBE,返回CUBE中所有列组合的小计信息,同时在最后显示总计信息
    7.7:GROUPING函数
         GROUPING函数可以接受一列,返回0或者1,如果列值为空,那么GROUPING()返回1;如果列值非空,则返回0,GROUPING()只能在使用ROLLUP或CUBE的查询中使用
    7.8:GROUPING SETS子句
         使用GROUPING SETS子句可以只返回小计记录.
  eg:
  select divid,jobid,sum(salary) from employee group by GROUPING SETS(divid,jobid) order by divid,jobid;
  DIV       JOB        SUM(SALARY)
  ------    -------    ---------------------
  BUS                    1610000
  OPE                    1320000
  SAL                     4936000
  SUP                    1015000
                     ENG         245000
       MGR       6246000
       PRE           800000
       TEC           115000
       WOR        1475000
 
       GROUPING SETS子句的性能一般比CUBE好,因此,应该尽可能使用GROUPING SETS,少使用CUBE..

       7.9:GROUPING_ID函数
        GROUPING位向量
 divid           jobid              位向量                  grouping_id返回值
 非空            非空                00                        0
 非空               空                 01                       1
 空                非空                10                       2
 空                   空                11                       3
 /** 位向量是2进制,grouping_id是10进制  */
      
       GROUPING_ID()用武之地在于使用HAVING子句过滤记录,HAVING子句可以将不包含小计或总计的记录除去,这只要简单的检查grouping_id()的返回值,看其大于0就可以实现
       select divid,jobid,grouping_id(divid,jobid) grpId,sum(salary) from employee group by cube(divid,jobid) having grouping_id(divid,jobid) > 0 order by divid,jobid;


       8.0:在GROUP_ID函数
            GROUP_ID函数可用于消除GROUP BY子句返回重复记录,GROUP_ID()不接受任何参数,如果某个特定的分组重复出现N次,那么GROUP_ID返回0到N-1之间的一个整数
     如果出现两次,那么GROUP_ID()函数等于1
     去重
     eg:
     select divid,jobid,group_id(),sum(salary) from employee group by divid,rollup(divid,jobid) having group_id = 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值