題目 編寫一個 SQL 查詢,獲取 表中第二高的薪水(Salary) 。 例如上述 表,SQL查詢應該返回 作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 。 解決方案 方法一 :使用 和 子句 將不同的薪資按降序排序,然後使用 子句獲得第二高的薪資。 然而,如果沒有這樣的第二最高工資,這 ...
題目:
編寫一個 SQL 查詢,獲取 Employee
表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee
表,SQL查詢應該返回 200
作為第二高的薪水。如果不存在第二高的薪水,那麼查詢應返回 null
。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
解決方案:
方法一:使用子查詢
和 LIMIT
子句
將不同的薪資按降序排序,然後使用 LIMIT
子句獲得第二高的薪資。
SELECT DISTINCT
Salary AS SecondHighestSalary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1;
然而,如果沒有這樣的第二最高工資,這個解決方案將被判斷為 “錯誤答案”,因為本表可能只有一項記錄。為了剋服這個問題,我們可以將其作為臨時表。
SELECT
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary;
方法二:使用 IFNULL
和 LIMIT
子句
解決 “NULL” 問題的另一種方法是使用 “IFNULL” 函數,如下所示。
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary;
方法三:使用Max
函數來做,邏輯是我們取出的不包含最大值的數字中的最大值,即為第二大值。然後使用Not in
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN
(SELECT MAX(Salary) FROM Employee);
方法四:和上面基本一樣,就是用小於號<
代替了Not in
關鍵字,效果相同
SELECT MAX(Salary) FROM Employee
Where Salary <
(SELECT MAX(Salary) FROM Employee);
摘自:
https://leetcode-cn.com/classic/problems/second-highest-salary/solution/
https://www.cnblogs.com/grandyang/p/5348961.html