【发布时间】:2019-03-24 13:39:51
【问题描述】:
我正在尝试显示所有收入高于本部门平均工资的员工的员工编号、员工姓名、部门和工资。
我只试过这个:
Select empno, ename, deptno,sal As Salary
From emp
Where sal >(SELECT AVG (sal) FROM emp);
【问题讨论】:
我正在尝试显示所有收入高于本部门平均工资的员工的员工编号、员工姓名、部门和工资。
我只试过这个:
Select empno, ename, deptno,sal As Salary
From emp
Where sal >(SELECT AVG (sal) FROM emp);
【问题讨论】:
对于这种结构,您可以使用关联条件。这需要引入表别名:
select e.empno, e.ename, e.deptno, e.sal As Salary
from emp e
where e.sal > (select avg(e2.sal) from emp e2 where e2.deptno = e.deptno);
【讨论】:
在员工工资高于平均值的情况下,将每个deptno的平均工资加入表中效率更高:
select e.empno, e.ename, e.deptno, e.sal
from emp e inner join (
select deptno, avg(sal) sal from emp group by deptno
) t
on t.deptno = e.deptno and t.sal < e.sal
【讨论】:
在 Oracle 数据库中,最有效的查询是使用分析函数:
select empno, ename, deptno, sal from
(select emp.*, AVG(sal) over (partition by deptno) avgsal from emp)
where sal > avgsal;
只需对视图进行一次表扫描和过滤。
【讨论】: