id empName DeptId empSalary
1 張三 1 2500
2 李四 1 2400
3 王二 2 2600
4 麻子 2 2500
select * from emp e1 where e1.empSalary > (select avg(empSalary) from emp e2 where e1.DeptId = e2.DeptId)
查詢結果:
1 張三 1 2500
3 王二 2 2600
補充:
今天在跟同事交流的時候,發現昨天少考慮了一樣東西,性能。
這個問題還有一種解決方式,SQL如下:
select e1.*
from emp e1 ,(select DeptId,avg(empSalary) as deptSalary from emp group by DeptId) as e2
where e1.DeptId = e2.DeptId and e1.empSalary > e2.deptSalary(測試通過)
現在來分析這兩種寫法的差別在哪。第一種寫法看似更簡捷,語句少了不少,第二種似乎更麻煩。其實不然,第一種寫法是比第二種效率更低,為什么。原因就在於 emp中員工每次比較薪水時,都會計算一次該員工所屬部門的平均薪水,這樣emp中有4條記錄,就會計算4次。而第二種方式只計算一次部門的評價薪水。如 果表中數據量比較大,對性能的影響會更明顯,所以第二種方式更佳。
