SELECT *
FROM dept_costs
WHERE dept_total > (SELECT dept_avg
FROM avg_cost)
ORDER BY department_name;
GROUP BY 扩展
带有ROLLUP和CUBE操作的GROUP BY子句
- 使用带有ROLLUP和CUBE操作的GROUP BY子句产生多种分组结果
- ROLLUP产生n + 1种分组结果,其是对GROUP BY子句的扩展
- CUBE产生2的n次方种分组结果,其是对GROUP BY子句的扩展
注:其中的n指的是group_by_expression的数目。
ROLLUP操作符 :ROLLUP产生n + 1种分组结果,顺序是从右向左
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY [ROLLUP] group_by_expression]
[HAVING having_expression]
[ORDER BY column];
CUBE操作符:CUBE会产生类似于笛卡尔集的分组结果
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY [CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];
GROUPING函数:能够实现更加直观的分组结果显示提示
SELECT [column,] group_function(column) . , [GROUPING(group_by_expression)]..
FROM table
[WHERE condition]
[GROUP BY [ROLLUP] [CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];
- GROUPING函数可以和CUBE或ROLLUP结合使用
- 使用GROUPING函数,可以找到哪些列在该行中参加了分组
- 使用GROUPING函数, 可以区分空值产生的原因
- GROUPING函数返回0 或1
GROUPING SETS:
- GROUPING SETS是对GROUP BY子句的进一步扩充
- 使用GROUPING SETS可以实现在同一个查询中定义多个分组集
- Oracle 对GROUPING SETS子句指定的分组集进行分组后用UNION ALL操作将各分组结果结合起来
- Grouping set 的优点:
– 只进行一次分组即可
– 不必书写复杂的UNION语句
– GROUPING SETS中包含的分组项越多性能越好
以下例子实现了对department_id, job_id分组,对job_id, manager_id分组,最终形成两个分组:
SELECT department_id, job_id, manager_id, avg(salary)
FROM employees
GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));
复合列
- 复合列是被作为整体处理的一组列的集合
- 使用括号将若干列组成复合列在ROLLUP或CUBE中作为整体进行操作
- 在ROLLUP或CUBE中,复合列可以避免产生不必要的分组结果
例如:GROUP BY ROLLUP( department_id, (job_id, manager_id)); //小括号实现复合列
连接分组集
- 连接分组集可以产生有用的对分组项的结合
- 将各分组集、ROLLUP 和CUBE用逗号连接,Oracle自动在GROUP BY子句中将各分组集进行连接
- 连接的结果是对各分组生成笛卡尔集
例如:GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d);
例如:GROUP BY department_id, ROLLUP(job_id), CUBE(manager_id);
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|