所有组函数都将表当作一个大型的信息组。但是,有时需要将此信息表分成几个较小的组。可以通过使用GROUP BY子句完成此任务。
可以通过使用GROUP BY子句将表中的行分成较小的组。
SELECT column, group_function(column)
FROM table
[WHERE condition]
[ORDER BY column];
可以使用GROUP BY子句将表中的行分成组。然后,可以使用组函数返回每个组的汇总信息。
在该语法中:
group_by_expression 指定某些列,这些列的值确定对行进行分组的基准准则
• 除非在GROUP BY子句中指定了单个列,否则即使在SELECT子句中包括组函数,也不能选择单个结果。如果未在GROUP BY子句中包括列的列表,则会收到一条错误消息。
• 通过使用WHERE子句,可以在将行分成多个组之前先排除某些行。
• 必须
SELECT列表中未出现在组函数中的所有列都必须包含在GROUP BY子句中。
使用GROUP BY子句时,应确保将SELECT列表中未出现在组函数中的所有列都包含在GROUP BY子句中。示例显示每个部门的部门编号和平均薪金。下面介绍含有
GROUP BY子句的SELECT语句是如何进行求值的:
• SELECT:子句指定要检索的列,如下所示:
- EMPLOYEES:表中的部门编号列
- GROUP BY:子句指定的组中所有薪金的平均值
• FROM:子句指定数据库必须访问的表:EMPLOYEES表。
• WHERE:子句指定要检索的行。由于没有WHERE子句,默认情况下会检索所有行。
• GROUP BY:子句指定如何对行进行分组。由于是按部门编号对行进行分组,因此应用于薪金列的AVG函数会计算每个部门的平均薪金。
注:要按升序或降序对查询结果进行排序,请在查询中包含ORDER BY子句。
GROUP BY列不一定要出现在SELECT列表中。
GROUP BY列不一定要出现在SELECT子句中。例如,示例中的SELECT语句显示每个部门的平均薪金,但没有显示相应的部门编号。但是如果没有部门编号,结果看起来毫无意义。
也可以在ORDER BY子句中使用组函数:
有时,需要查看组内的各个组的结果。
此示例显示一个报表,其中显示要付给各个部门中每种职务的薪金总和。
EMPLOYEES表首先按部门编号进行分组,然后在各个组中又按职务进行分组。例如,将部门50 中的四个仓储职员分成一个组,并为该组中的所有仓储职员生成一个结果(薪金总和)。
通过列出多个GROUP BY列,可以返回组和子组的汇总结果。GROUP BY子句对行进行分组,但不保证结果集的顺序。要对组进行排序,请使用ORDER BY子句。
在示例中,包含GROUP BY子句的SELECT语句按如下方式进行求值:
• SELECT子句指定要检索的列:
- EMPLOYEES表中的部门ID
- EMPLOYEES表中的职务ID
- GROUP BY子句指定的组中所有薪金的总和
• FROM子句指定数据库必须访问的表:EMPLOYEES表。
• WHERE子句将结果集限定为部门ID 大于40 的行。
• GROUP BY子句指定应如何对结果行进行分组:
- 首先,按部门ID 对行进行分组
- 其次,在部门ID 组中按职务ID 对行进行分组
• ORDER BY子句按部门ID 对结果进行排序。
注:SUM函数将应用于每个部门ID 组的结果集中所有职务ID 的薪金列。另外,请注意,不返回SA_REP 行。此行的部门ID 为NULL,因此不满足WHERE条件。
更多详情见请继续阅读下一页的精彩内容:
相关阅读:
Oracle分组函数rollup,cube
Oracle 分组函数用法示例详解
Oracle分组函数之ROLLUP魅力
Oracle分组函数之CUBE魅力
Oracle 分组查询详解