Oracle分组ROLLUP、GROUP BY、GROUPING、GROUPING SETS区别和作用
2016-01-21 21:10
519 查看
1.ROLLUP
ROLLUP的作用相当于
最后面的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))
注意面的语句是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时,显示的是某部门某职位的工资和计
第一个SA_REP表示此jobid没有部门,为null
5.GROUPING SETS与GROUPING的作用是不同的
Oracle服务器计算GROUPING SETS子句中所有的组并将结果通过UNION ALL组合成一个结果集.
GROUPING SETS的效果:1.只需要访问一次基表.2.不需要写很复杂的UNION语句.
上面得到的是通过job_id,manager_id分组的avg(salary)
下面的是通过department_id,job_id分组的avg(salary)
ROLLUP的作用相当于
[code]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))
[code]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时,显示的是某部门某职位的工资和计
[code]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语句.
[code]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)
相关文章推荐
- Oracle使用SQL传输表空间2源环境:RHEL 6.4 + Oracle 11.2.0.4
- Oracle通过JOB定时自动操作数据库删除数据
- oracle表空间表分区详解及oracle表分区查询使用方法
- oracle4之PLSQL工具
- oracle3之数据库对象
- oracle2之约束
- oracle第2天之sql
- RHEL6静默安装Oracle11g
- Maven管理Oracle11gJDBC驱动(手动安装oracle11g)详细版
- 数据-Oracle补零相关
- 控制文件 日志文件 表空间
- 脚本+实例
- Oracle安装
- Oracle 锁
- 讲解Oracle数据库中结束死锁进程的一般方法
- Oracle数据表中的死锁情况解决方法
- 打开或关闭oracle数据库的闪回功能步骤
- 简单说明Oracle数据库中对死锁的查询及解决方法
- Oracle使用SQL传输表空间
- Oracle-本地连接没问题,远程连接有问题解决方案