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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章