一、題目名稱sql
Second Highest Salary(第二高的工資)數據庫
二、題目地址命令行
https://leetcode.com/problems/second-highest-salary/code
三、題目內容排序
如今有一張記錄了Id(主鍵)和Salary(工資)的表,求出其中第二高的工資。若是不存在第二高的工資,返回null。leetcode
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
四、初始化數據庫腳本get
在MySQL數據庫中創建一個名爲LEETCODE的數據庫,用MySQL命令行中的source命令執行下面腳本:class
-- 執行腳本前必須創建名爲LEETCODE的DATABASE USE LEETCODE; DROP TABLE IF EXISTS Employee; CREATE TABLE Employee ( Id INT NOT NULL PRIMARY KEY, Salary INT ); INSERT INTO Employee (Id, Salary) VALUES (1, 100); INSERT INTO Employee (Id, Salary) VALUES (2, 200); INSERT INTO Employee (Id, Salary) VALUES (3, 200); INSERT INTO Employee (Id, Salary) VALUES (4, 300); INSERT INTO Employee (Id, Salary) VALUES (5, 400); INSERT INTO Employee (Id, Salary) VALUES (6, 400);
五、解題SQL1基礎
解決這個問題的基礎是先求出最高的工資,再求第二高的工資(即不等於最高工資的最高工資)。方法
最高工資能夠用下面這個SQL語句求出:
SELECT MAX(Salary) FROM Employee;
那麼第二高的工資就是:
SELECT MAX(Salary) FROM Employee WHERE Salary <> ( SELECT MAX(Salary) FROM Employee);
這也就是能夠AC掉本題的SQL語句!
這個問題若是向下拓展,還能夠繼續寫出求第三高、第四高的工資。這些SQL語句從寫法上來講是類似的。如求第三高工資的SQL語句能夠寫成下面這樣:
SELECT MAX(Salary) FROM Employee WHERE Salary <> ( SELECT MAX(Salary) FROM Employee) AND Salary <> ( SELECT MAX(Salary) FROM Employee WHERE Salary <> ( SELECT MAX(Salary) FROM Employee));
即不等於最大和第二大工資裏面的最高工資。
六、解題SQL2
另外一個更簡單的方法是先將源數據按Salary列從大到小去重排序,再直接取出排序後結果集的第n行,這行數據Salary列的值就是第n大的工資了。這個方法在n比較大的時候能夠比上一個方法少些不少行SQL語句。
一段能夠AC掉本題的SQL語句以下:
SELECT CASE WHEN COUNT(Salary) >= 1 THEN ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1) ELSE NULL END AS NthSalary FROM Employee;
在上面這個SQL語句的第六行,將LIMIT後面第一個數字填寫n-1便可求出第n大的工資。本題中求的是第二大工資,所以寫成了 LIMIT 1, 1
END