grouping sets子句允许你指定多个group by 选项。增强了group by 的功能。
可以通过一条select 语句实现复杂繁琐的多条select 语句的查询。并且更加的
高效,解析存储一条SQL于语句。
下面通过使用
grouping sets 子句与没有
使用grouping sets 子句来对比学习该子句。
查询每个部门的每类工作的平均工资,
使用grouping sets的语句。
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by grouping sets ((department_id,job_id));
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
110 AC_ACCOUNT 8300
80 SA_REP 7909.09091
90 AD_VP 17000
50 ST_CLERK 2785
110 AC_MGR 12000
50 ST_MAN 7280
80 SA_MAN 12200
50 SH_CLERK 3215
没有使用grouping sets 的对等语句。
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by department_id,job_id;
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
110 AC_ACCOUNT 8300
80 SA_REP 7909.09091
90 AD_VP 17000
50 ST_CLERK 2785
110 AC_MGR 12000
50 ST_MAN 7280
80 SA_MAN 12200
50 SH_CLERK 3215
再查询每个部门每类工作平均工资的基础上,还要查询出每个部门的平均工资。
使用grouping sets的语句。
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by grouping sets ((department_id,job_id),department_id);
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
10 AD_ASST 4400#
每个部门每类工作的平均工资。
10 4400#
每个部门的平均工资。
20 MK_MAN 13000
20 MK_REP 6000
20 9500
30 PU_MAN 11000
30 PU_CLERK 2780
30 4150
40 HR_REP 6500
没有使用grouping sets 的对等语句。
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by (department_id,job_id)
4 union
5 select department_id,null,avg(salary)
6 from hr.employees
7 group by department_id;
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
10 AD_ASST 4400
10 4400
20 MK_MAN 13000
20 MK_REP 6000
20 9500
30 PU_CLERK 2780
30 PU_MAN 11000
30 4150
40 HR_REP 6500
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by grouping sets ((department_id,job_id),department_id,());
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
10 AD_ASST 4400
10 4400
20 MK_MAN 13000
20 MK_REP 6000
20 9500
30 PU_MAN 11000
30 PU_CLERK 2780
再查询每个部门每类工作平均工资与查询出每个部门的平均工资
的基础上,还要查询整个企业中雇员的平均工资。
使用grouping sets的语句。
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by grouping sets ((department_id,job_id),department_id,()); #() 表示做一个整体的聚集。
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
10 AD_ASST 4400
10 4400
20 MK_MAN 13000
20 MK_REP 6000
20 9500
30 PU_MAN 11000
30 PU_CLERK 2780
。
。
。
6380.90909 #这一行查询的是整个employees 中雇员总的平均工资。
没有使用grouping sets 的对等语句。
SQL> select department_id,job_id,avg(salary)
2 from hr.employees
3 group by (department_id,job_id)
4 union
5 select department_id,null,avg(salary)
6 from hr.employees
7 group by department_id
8 union
9 select null,null,avg(salary)
10 from hr.employees;
DEPARTMENT_ID JOB_ID AVG(SALARY)
------------- ---------- -----------
10 AD_ASST 4400
10 4400
20 MK_MAN 13000
20 MK_REP 6000
20 9500
30 PU_CLERK 2780
30 PU_MAN 11000
30 4150
40 HR_REP 6500
。
。
。
6380.90909 #这一行查询的是整个employees 中雇员总的平均工资。