Oracle DB对行进行分组-group by、having
Oracle DB对行进行分组-group by、having创建数据组所有组函数都将表当作一个大型的信息组。但是,有时需要将此信息表分成几个较小的组。可以通过使用GROUP BY子句完成此任务。创建数据组: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子句中使用列别名。使用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 576012 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子句GROUP BY列不一定要出现在SELECT列表中。hr@TEST0924> SELECT AVG(salary) FROM employees GROUP BY department_id ;AVG(SALARY)-----------8601.333334150700095001000019333.3333101543475.5555665008955.882354400576012 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.333312 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 中的四个仓储职员分成一个组,并为该组中的所有仓储职员生成一个结果(薪金总和)。对多个列使用GROUP BY子句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 8300&nbs上一个:Oracle DB组函数
下一个:Oracle中与时间有关的计算
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?