所有组函数都将表当作一个大型的信息组。但是,有时需要将此信息表分成几个较小的组。可以通过使用GROUP BY子句完成此任务。
可以通过使用GROUP BY子句将表中的行分成较小的组。SELECT column, group_function(column)FROM table[WHERE condition]
[GROUP BY group_by_expression][ORDER BY column]; 可以使用GROUP BY子句将表中的行分成组。然后,可以使用组函数返回每个组的汇总信息。在该语法中:group_by_expression 指定某些列,这些列的值确定对行进行分组的基准准则• 除非在GROUP BY子句中指定了单个列,否则即使在SELECT子句中包括组函数,也不能选择单个结果。如果未在GROUP BY子句中包括列的列表,则会收到一条错误消息。• 通过使用WHERE子句,可以在将行分成多个组之前先排除某些行。• 必须将列包括在GROUP BY子句中。
• 不能在GROUP BY子句中使用列别名。 SELECT列表中未出现在组函数中的所有列都必须包含在GROUP BY子句中。
hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ; DEPARTMENT_ID AVG(SALARY)------------- -----------100 8601.3333330 4150700020 950070 1000090 19333.3333110 1015450 3475.5555640 650080 8955.8823510 440060 5760 12 rows selected. 使用GROUP BY子句时,应确保将SELECT列表中未出现在组函数中的所有列都包含在GROUP BY子句中。示例显示每个部门的部门编号和平均薪金。下面介绍含有GROUP BY子句的SELECT语句是如何进行求值的:• SELECT:子句指定要检索的列,如下所示:- EMPLOYEES:表中的部门编号列- GROUP BY:子句指定的组中所有薪金的平均值• FROM:子句指定数据库必须访问的表:EMPLOYEES表。• WHERE:子句指定要检索的行。由于没有WHERE子句,默认情况下会检索所有行。• GROUP BY:子句指定如何对行进行分组。由于是按部门编号对行进行分组,因此应用于薪金列的AVG函数会计算每个部门的平均薪金。注:要按升序或降序对查询结果进行排序,请在查询中包含ORDER BY子句。
GROUP BY列不一定要出现在SELECT列表中。
hr@TEST0924> SELECT AVG(salary) FROM employees GROUP BY department_id ; AVG(SALARY)-----------8601.333334150700095001000019333.3333101543475.5555665008955.8823544005760 12 rows selected. GROUP BY列不一定要出现在SELECT子句中。例如,示例中的SELECT语句显示每个部门的平均薪金,但没有显示相应的部门编号。但是如果没有部门编号,结果看起来毫无意义。也可以在ORDER BY子句中使用组函数:
hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ORDER BY AVG(salary); DEPARTMENT_ID AVG(SALARY)------------- -----------50 3475.5555630 415010 440060 576040 65007000100 8601.3333380 8955.8823520 950070 10000110 1015490 19333.3333 12 rows selected. 有时,需要查看组内的各个组的结果。
hr@TEST0924> SELECT department_id, job_id, sum(salary) FROM employees GROUP BY department_id, job_id ORDER BY job_id; DEPARTMENT_ID JOB_ID SUM(SALARY)------------- ---------- -----------110 AC_ACCOUNT 8300110 AC_MGR 1200810 AD_ASST 4400...20 rows selected. 此示例显示一个报表,其中显示要付给各个部门中每种职务的薪金总和。EMPLOYEES表首先按部门编号进行分组,然后在各个组中又按职务进行分组。例如,将部门50 中的四个仓储职员分成一个组,并为该组中的所有仓储职员生成一个结果(薪金总和)。
hr@TEST0924> SELECT department_id, job_id, SUM(salary) FROM employees WHERE department_id > 40 GROUP BY department_id, job_id ORDER BY department_id; DEPARTMENT_ID JOB_ID SUM(SALARY)------------- ---------- -----------50 SH_CLERK 6430050 ST_CLERK 5570050 ST_MAN 3640060 IT_PROG 2880070 PR_REP 1000080 SA_MAN 6100080 SA_REP 24350090 AD_PRES 2400090 AD_VP 34000100 FI_ACCOUNT 39600100 FI_MGR 12008110 AC_ACCOUNT 8300110 AC_MGR 12008 13 rows selected.通过列出多个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条件。
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2013-10/91659p2.htm
相关阅读:Oracle分组函数rollup,cube http://www.linuxidc.com/Linux/2013-03/80824.htmOracle 分组函数用法示例详解 http://www.linuxidc.com/Linux/2013-02/79857.htmOracle分组函数之ROLLUP魅力 http://www.linuxidc.com/Linux/2012-08/67357.htm Oracle分组函数之CUBE魅力 http://www.linuxidc.com/Linux/2012-08/67356.htmOracle 分组查询详解 http://www.linuxidc.com/Linux/2012-03/56648.htm
Oracle DB 使用连接显示多个表中的数据Oracle DB TO_CHAR、TO_DATE、TO_NUMBER 函数相关资讯 Oracle DB Oracle having Oracle分组
- having在Oracle和MySQL中不一样的 (08/12/2014 10:44:57)
- Oracle中where子句和having子句中 (01/04/2013 12:30:49)
| - Oracle DB 使用连接显示多个表中的 (10/20/2013 10:32:19)
- 关于Oracle DB中SQL Script的注释( (07/14/2012 05:58:15)
|
本文评论 查看全部评论 (0)