LeetCode:MySQL的IN字符竟然還有這種操作

題目描述: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;

程序也可以運行,下圖爲運行結果,但是並不是預期結果。
image.png
這是爲什麼呢?
因爲上條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解決。

修改思路:

  1. 先查詢每個部門內最高工資
select DepartmentId,max(Salary)
       from Employee
       group by DepartmentId;
  1. 再使用內聯結把表 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);

這裏值得注意的是兩點:group by 只會返回默認排序中的第一行數據;兩個字段的IN操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章