Oracle DB对行进行分组-group by、having(三)
rtment_id HAVING AVG(salary) > 8000;
DEPARTMENT_ID AVG(SALARY)
------------- -----------
100 8601.33333
20 9500
70 10000
90 19333.3333
110 10154
80 8955.88235
6 rows selected.
限定组结果
与使用WHERE子句限定所选行的方式相同,可以使用HAVING子句限定组。要在最高薪金大于$10,000 的每个部门中查找最高薪金,需要执行以下操作:
1.通过按部门编号进行分组,查找每个部门的最高薪金。
2.将组限定为最高薪金大于$10,000 的部门。
使用HAVING子句限定组结果
使用HAVING子句时,
Oracle Server 将按以下方式对组进行限定:
1. 对行进行分组。
2. 应用组函数。
3. 显示符合HAVING子句的组。
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
可使用HAVING子句指定要显示的组,该子句基于汇总信息进一步限定组。
在上述语法中,group_condition用于限定满足指定条件的组的返回行组。
使用HAVING子句时,Oracle Server 会执行以下步骤:
1.对行进行分组。
2.对组应用组函数。
3.显示符合HAVING子句中的标准的组。
HAVING子句可放在GROUP BY子句之前,但建议将GROUP BY子句放在前面,因为这样更符合逻辑。应先形成组并计算组函数,然后再对SELECT列表中的组应用HAVING子句。
注:WHERE子句限定行,而HAVING子句限定组。
使用HAVING子句
hr@TEST0924> SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ;
DEPARTMENT_ID MAX(SALARY)
------------- -----------
100 12008
30 11000
20 13000
90 24000
110 12008
80 14000
6 rows selected.
示例显示最高薪金大于$10,000 的部门的部门编号和最高薪金。
可以在SELECT列表中使用GROUP BY子句,而不使用组函数。如果根据组函数的结果来限定行,则必须采用GROUP BY子句和HAVING子句。
下面的示例显示最高薪金大于$10,000 的部门的部门编号和平均薪金:
hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING max(salary)>10000;
DEPARTMENT_ID AVG(SALARY)
------------- -----------
100 8601.33333
30 4150
20 9500
90 19333.3333
110 10154
80 8955.88235
6 rows selected.
使用HAVING子句
hr@TEST0924> SELECT job_id, SUM(salary) PAYROLL FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary);
JOB_ID PAYROLL
---------- ----------
PU_CLERK 13900
AD_PRES 24000
IT_PROG 28800
AD_VP 34000
ST_MAN 36400
FI_ACCOUNT 39600
ST_CLERK 55700
SA_MAN 61000
SH_CLERK 64300
9 rows selected.
示例显示工资合计超过$13,000 的每个职务的职务ID 和月薪总额。该示例将销售代表排除在外,而且按月薪总额对列表进行排序。
嵌套组函数
下列语句显示最高平均薪金:
hr@TEST0924> SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id;
MAX(AVG(SALARY))
----------------
19333.3333
组函数可以嵌套两层。示例计算每个department_id对应的平均薪金,然后显示最高平均薪金。
请注意,嵌套组函数时,必须使用GROUP BY子句。