MySQL: 找出員工表中最高、第二高、第N高的薪水

假設有如下所示的員工薪水錶:
在這裏插入圖片描述
找出表中最高的薪水非常簡單,編寫下面的SQL即可:

SELECT max(Salary) as HighestSalary 
FROM Employee;

利用查詢的嵌套,也可以較爲容易地找出表中第二高的薪水:

SELECT max(Salary) 
FROM Employee WHERE Salary < (SELECT max(Salary) FROM Employee);

不過,要是我們想找出第三高、第四高的薪水呢?有的人可能會說按照上面的思路,在SQL語句的外層再嵌套查詢,不過這樣寫起來很麻煩,並且嵌套太多的子查詢會影響性能。採用下面的SQL語句是個更好的選擇:

SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1,1;

其中LIMIT 1,1也可以寫成LIMIT 1 OFFSET 1,事實上後面的寫法更好。LIMIT N OFFSET M代表從第M+1行開始取N行。要求第三高、第四高、第N高的薪水,只需要將末尾改成LIMIT 1 OFFSET N-1即可。
針對第N高的薪水這類問題,我們還可以自定義函數來解決。

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M=N-1;
  RETURN (
      SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET M
  );
END

注意,求第N高的薪水實際上是把表排序後偏移N-1行,因此需要先把N的值減1存在M中。

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