題目描述:MySQL查詢部門工資最高的員工
Employee 表包含所有員工信息,每個員工有其對應的 Id, salary 和 department Id。
Department 表包含公司所有部門的信息。
題目要求
編寫一個 SQL 查詢,找出每個部門工資最高的員工。
例如,根據上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
解題思路
作爲一名小菜雞,我剛開始是這樣寫的
select Department.name as Department,
Employee.name as Employee,
max(Salary) as Salary
from Department
inner join Employee
on Employee.DepartmentId=Department.Id
group by Employee.DepartmentId;
程序也可以運行,下圖爲運行結果,但是並不是預期結果。
這是爲什麼呢?
因爲上條SQL的執行順序:
先執行from,完成Department和Employee兩個表內聯結;
再執行group by,數據按照Employee.DepartmentId進行分組。group by 只會返回默認排序中的第一行數據
然後執行select,此時的聚合函數max(Salary)是每組DepartmentId中的Salary最大值,且此時查找的Employee.name與max(Salary)並沒有關係。
注意:group by函數的坑
group by 只會返回默認排序中的第一行數據。
下面用一個小例子解釋這句話
例如:查詢Employee表中每個部門的id,name
若使用group by函數分組查詢,代碼如下
select id,name
from Employee
group by DepartmentId;
查詢結果爲
而實際上表Employee中DepartmentId=1的id有兩個,查詢結果卻只顯示了一個。這正是因爲group by 只會返回默認排序中的第一行數據。
所以這裏不能使用group by解決。
修改思路:
- 先查詢每個部門內最高工資
select DepartmentId,max(Salary)
from Employee
group by DepartmentId;
- 再使用內聯結把表 Employee 和 Department 連接,再在這張臨時表裏用 IN 語句查詢部門名字和工資的關係。
select Department.name as Department,
Employee.name as Employee,
Salary
from Department
inner join Employee
on Employee.DepartmentId=Department.Id
where (Employee.DepartmentId,Salary) in #兩個字段的IN操作
(select DepartmentId,max(Salary)
from Employee
group by DepartmentId);