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)