Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用为什么oracle网站进不去
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(*)
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系统默认进行了排序
这里的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> /
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;依此类推……,就不用去多次全表扫描
通过一次全表扫描,得出a,b,c的分组统计信息后;分组统计a,b 相同,c不同的项即可得到a,b;依此类推……,就不用去多次全表扫描
3.ROLLUP的另类用法ROLLUP(a,(b,c))
ROLLUP((a,b))
SQL> ed
已写入 file afiedt.buf
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> /
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)
不是group by rollup (department_id,job_id)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论