当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
Oracle通用函数分组函数子查询(四)
发布时间:2010/9/10 14:47:36 来源:www.xue.net 编辑:城市总裁吧

  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