[精讚] [會員登入]
417

【MySQL】每個類別中取前三高

一個由多層次所組成的SELECT述句

分享此文連結 //n.sfs.tw/16155

分享連結 【MySQL】每個類別中取前三高@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2023-04-11 23:22:54 最後編修
2023-04-10 15:06:36 By 過路君子
 

大家好,這裡是快忘光SQL的小編過路君子

看了看紀錄,上次寫這麼複雜的SQL已經是在一年之前

 

 

SQL 小編說常用也常用,說不常用也不常用,為什麼這麼說呢?

因為平常使用的時候就只會用基本的 SELECT 功能,什麼 sub select 根本就不會用到。

今天回來複習一下 MySQL 的 SQL 語法

 

那在開始之前,先假設我們有以下的資料表:

Table: Employee
+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+

Table: Department
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

並且具有以下的內容:

Employee table:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 85000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
| 5  | Janet | 69000  | 1            |
| 6  | Randy | 85000  | 1            |
| 7  | Will  | 70000  | 1            |
+----+-------+--------+--------------+
Department table:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+

 

不考慮資料重複或並列

我們則需要輸出以下的資料:

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Joe      | 85000  |
| IT         | Randy    | 85000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+

簡單來說就是將 departmentId 轉換成對應的部門名稱,然後要將每個前三高薪水(Salary)的人列出,最後在對資料做排序。

 

直接上 SQL 語法:

SELECT c.name AS Department, a.name AS Employee, a.salary AS Salary
FROM Employee AS a
LEFT JOIN Department AS c
  ON c.id = a.departmentId
WHERE
  (
    SELECT COUNT(b.salary)
    FROM Employee AS b
    WHERE b.departmentId = a.departmentId
      AND a.salary < b.salary
  ) < 3
ORDER BY c.id, a.salary;

輸出結果就會如上方所示。

其中的 LEFT JOIN 作用就是為了要讓 Department 表裡的資料直接接在 Employee 表的後面,只有當 Department 表內的 id 和 Employee 表內的 departmentId 相同才需要做串接。

而比較重要的就是 WHERE 內的 sub select 了,此 sub select 會試著去統計在 Employee 表內目前有幾個人的薪水大於目前所執行到人的薪水。

而最後的小於三則是取前三高,如果要取前五高就改成 5 即可。

 

考慮資料重複或並列

若需考慮資料重複,那我們要輸出的資料變成如下:

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Joe      | 85000  |
| IT         | Randy    | 85000  |
| IT         | Will     | 70000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+

這應該才算是比較常用到的手段,總之寫法如下:

SELECT c.name AS Department, a.name AS Employee, a.salary AS Salary
FROM Employee AS a
LEFT JOIN Department AS c
  ON c.id = a.departmentId
WHERE
  (
    SELECT COUNT(b.salary)
    FROM (SELECT DISTINCT d.departmentId, d.salary FROM Employee AS d) AS b
    WHERE b.departmentId = a.departmentId
      AND a.salary < b.salary
  ) < 3;
ORDER BY c.id, a.salary;

 

只需要改一行就可以了。

簡單來說,在開始找有幾個人薪水大於目前的人之前,先把要比較的表去除重複的資料,這樣統計的時候也不會重複統計啦。

 

 

 

後記

總之這次寫完感覺這個 SQL 很有用,所以就在這邊留存一份,省的未來在那邊推敲半天。

END

你可能感興趣的文章

【MEGAcmd】[Linux] 如何解決Unable to connect to service: error=2 用了好久的軟體突然停止一切的運作了。

【Wicket】[Header]如何讀取來自客戶端地檔頭和傳送自訂擋頭至客戶端 當需要設定檔頭或是讀取來自客戶端的檔頭時,這些程式碼就很好用

【Firefox \ Maven】[Headless](Linux) 如何使用Maven打包並驅動Firefox 有時候我們需要取得渲染後的網頁,當然是直接呼叫瀏覽器出來用啦

【Wickct】(link) <a> 如何新增超連結 簡單來說有兩種方式,小編個人比較偏好 的方法

【無料版模】﹝CSS&HTML﹞製作epub電子書版模免費下載&附使用教學 一個專門用來製作epub的簡單CSS檔案,基本上已經可以做出一本還不錯的電子書,讓妳的電子書不在只有預設的字體、樣式

【PaperMC - API】如何發送指令到伺服器內 How to sending or executing commands to server

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

希萌創意預計在今年7月繼東津萌米之後再次推出新遊戲--食用性少女! 今天來介紹希萌創意的心企劃案,來讓大家知道這個消息!讓大家的錢包君一起來減肥吧!Ψ(☆w☆)

高捷少女:耐耐的新年驚喜① 耐耐拿出手機。「我回來囉。」她說。幾分鐘後,木門緩緩打開。當它完全開啟的那一刻,小穹手中的包包掉到地上;艾米揉揉雙眼,確定自己看見的景象;婕兒的三魂七魄飛到了九霄雲外。

婕兒──她的青春③ 「墮天使穹音!」婕兒拿出平底鍋。 耐耐憋著笑搖搖頭。「不是喔,她是我的……我的……」 「替身。」小穹小聲提醒忘記台詞的耐耐。

【英翻中歌詞】(二創歌)東方妖妖夢-人形裁判 ~玩弄人偶的少女 人形裁判 ~ 人の形弄びし少女 很久很久以前,在一個神奇的異地,住著一位少女,十分惹人憐愛 她的皮膚就像陶瓷一樣潔白,眼睛就像藍色寶珠般明亮

【贈送序號】[一次性序號](先搶先贏)RO仙境傳說 因個人用不到,所以將其收集後放上來贈送給大家