题目要求:查看部门的平均工资,前提是该部门的平均工资高于2000。
附表如下图所示:
我写的解决方案:
--查看部门的平均工资,前提是该部门的平均工资高于2000
SELECT AVG(sal) ,deptno
FROM emp
WHERE (AVG(sal)>2000)
GROUP BY deptno ;
结果一运行报错了,说是“ORA-00934: 此处不允许使用分组函数”
错误原因分析:
-
WHERE中不能使用聚合函数作为过滤条件,原因是过滤时机不对。
WHERE是在数据库检索表中数据时,对数据逐条过滤以决定是否查询出该数据时使用的,所以WHERE用来确定结果集的数据。 -
使用聚合函数的结果作为过滤条件,那么一定是数据从表中查询完毕(WHERE在查询过程中发挥作用)得到结果集,并且分组完毕才进行聚合函数统计结果,得到后才可以对分组进行过滤,由此可见,这个过滤时机是在WHERE之后进行的。
-
聚合函数的过滤条件要在HAVING子句中使用,HAVING必须跟在GROUP BY子句之后,HAVING是用来过滤分组的
解决方案:
SELECT AVG(sal) ,deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal)>2000;
然后根据HAVING条件,过滤掉部门的平均工资低于2000的项。