Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用

1.ROLLUP

ROLLUP的作用相当于

SQL> set autotrace on
SQL> select department_id,job_id,count(*)
    from employees
    group by department_id,job_id
   union
    select department_id,null,count(*)
    from employees
    group by department_id
    union
    select null,null,count(*)
   from employees;

这里写图片描述

最后面的SA_REP表示此jobid没有部门,为null
这里的union系统默认进行了排序
这里写图片描述

使用ROLLUP能达到上面GROUP BY的功能,但性能开销更小

SQL> ed
已写入 file afiedt.buf
select department_id,job_id,count(*)
from employees
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

   select department_id,job_id,count(*)
   from employees
   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,
             SUM(salary),
             GROUPING(department_id) GRP_DEPT,
             GROUPING(job_id) GRP_JOB
    FROM     employees
    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,
             manager_id,avg(salary)
    FROM     employees
    GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));

这里写图片描述
上面得到的是通过job_id,manager_id分组的avg(salary)
下面的是通过department_id,job_id分组的avg(salary)
这里写图片描述
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值