Oracle DB对行进行分组-group by、having(二)
50 ST_MAN 36400
60 IT_PROG 28800
70 PR_REP 10000
80 SA_MAN 61000
80 SA_REP 243500
90 AD_PRES 24000
90 AD_VP 34000
100 FI_ACCOUNT 39600
100 FI_MGR 12008
110 AC_ACCOUNT 8300
110 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条件。
使用组函数的非法查询
SELECT列表中不在聚集函数中的任何列或表达式都必须出现在GROUP BY子句中:
hr@TEST0924> SELECT department_id, COUNT(last_name) FROM employees;
SELECT department_id, COUNT(last_name) FROM employees
*
ERROR at line 1:
ORA-00937: not a single-group group function
必须添加GROUP BY子句,才能对每个department_id对应的姓氏进行计数。
hr@TEST0924> SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id;
SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
要么在GROUP BY中添加job_id,要么从SELECT列表中删除job_id列。
只要在同一个SELECT语句中混合使用单个项(DEPARTMENT_ID) 和组函数(COUNT),就必须包括一个指定这些单个项(本例中为DEPARTMENT_ID)的GROUP BY子句。如果缺少GROUP BY子句,则会出现错误消息“not a single-group group function(不是一个组的组函数)”,而且显示一个指向错误列的星号(*)。可通过添加GROUP BY子句更正第一个示例中的错误:
hr@TEST0924> SELECT department_id, count(last_name) FROM employees GROUP BY department_id;
DEPARTMENT_ID COUNT(LAST_NAME)
------------- ----------------
100 6
30 6
1
20 2
70 1
90 3
110 2
50 45
40 1
80 34
10 1
60 5
12 rows selected.
SELECT列表中不在聚集函数中的任何列或表达式都必须出现在GROUP BY子句中。
在第二个示例中,job_id既不在GROUP BY子句中也不在组函数中,因此将出现“not a GROUP BYexpression(不是GROUP BY表达式)”错误。可通过
在GROUP BY子句中添加job_id更正第二个示例中的错误。
hr@TEST0924> SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id, job_id;
DEPARTMENT_ID JOB_ID COUNT(LAST_NAME)
------------- ---------- ----------------
110 AC_ACCOUNT 1
90 AD_VP 2
50 ST_CLERK 20
...
20 rows selected.
使用组函数的非法查询
不能使用WHERE子句限定组。
hr@TEST0924> SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id;
SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id
*
ERROR at line 1:
ORA-00934: group function is not allowed here
可以使用HAVING子句限定组。
不能在WHERE子句中使用组函数。
不能使用WHERE子句限定组。示例中的SELECT语句产生了一个错误,因为该语句使用WHERE子句限定显示平均薪金大于$8,000 的那些部门的平均薪金。
但是,通过使用HAVING子句限定组,可以更正该示例中的错误:
hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY depa