Oracle分組ROLLUP、GROUP BY、GROUPING、GROUPING SETS區別和作用


1.ROLLUP

 

ROLLUP的作用相當於
SQL> set autotrace on
SQL> select department_id,job_id,count(*)
  2  from employees
  3  group by department_id,job_id
  4  union
  5  select department_id,null,count(*)
  6  from employees
  7  group by department_id
  8  union
  9  select null,null,count(*)
 10  from employees;

最后面的SA_REP表示此jobid沒有部門,為null
這里的union系統默認進行了排序

使用ROLLUP能達到上面GROUP BY的功能,但性能開銷更小
SQL> ed
已寫入 file afiedt.buf
  1  select department_id,job_id,count(*)
  2  from employees
  3* group by rollup (department_id,job_id)
SQL> /

2.為什么ROLLUP會比GROUP BY性能好

ROLLUP(a,b,c)=a,b,c+a,b+a+All
通過一次全表掃描,得出a,b,c的分組統計信息后;分組統計a,b 相同,c不同的項即可得到a,b;依此類推……,就不用去多次全表掃描

 

3.ROLLUP的另類用法ROLLUP(a,(b,c))
ROLLUP((a,b))
SQL> ed
已寫入 file afiedt.buf

  1  select department_id,job_id,count(*)
  2  from employees
  3* group by rollup ((department_id,job_id))
SQL> /
注意面的語句是group by rollup ((department_id,job_id))
不是group by rollup (department_id,job_id)

 

4.GROUPING函數的作用是放總記

如一個公司有多個部門,一個部門有多個崗位,一個崗位上有多個人
Rollup(部門,工作崗位)  sum(每人的工資)
當部門的GROUPING為0,工作崗位的GROUPING也為0時,說明是公司發的總工資,此時放公司總計
當部門的GROUPING為0,工作崗位的GROUPING也為1時,說明是部門發的總工資,此時放部門小記
當部門的GROUPING為1,工作崗位的GROUPING也為1時,顯示的是某部門某職位的工資和計
SQL> SELECT   department_id DEPTID, job_id JOB,
  2           SUM(salary),
  3           GROUPING(department_id) GRP_DEPT,
  4           GROUPING(job_id) GRP_JOB
  5  FROM     employees
  6  GROUP BY ROLLUP(department_id, job_id);

第一個SA_REP表示此jobid沒有部門,為null

 

5.GROUPING SETS與GROUPING的作用是不同的

 

Oracle服務器計算GROUPING SETS子句中所有的組並將結果通過UNION ALL組合成一個結果集.
GROUPING SETS的效果:1.只需要訪問一次基表.2.不需要寫很復雜的UNION語句.
SELECT   department_id, job_id, null manager_id,avg(salary)
FROM     employees
GROUP BY (department_id,job_id)
UNION ALL
SELECT   null department_id, job_id, manager_id,avg(salary)
FROM     employees
GROUP BY (job_id,manager_id)
等同於
SQL> set autotrace on
SQL> SELECT   department_id, job_id,
  2           manager_id,avg(salary)
  3  FROM     employees
  4  GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));

上面得到的是通過job_id,manager_id分組的avg(salary)
下面的是通過department_id,job_id分組的avg(salary)


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM