問題:函數
Write a SQL query to get the second highest salary from the Employee
table.spa
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
For example, given the above Employee table, the query should return 200
as the second highest salary. If there is no second highest salary, then the query should return null
.code
+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
解決:get
① 先來看一種使用Limit和Offset兩個關鍵字的解法,MySQL中Limit後面的數字限制了咱們返回數據的個數,Offset是偏移量,那麼若是咱們想找第二高薪水,咱們首先能夠先對薪水進行降序排列,而後咱們將Offset設爲1,那麼就是從第二個開始,也就是第二高薪水,而後咱們將Limit設爲1,就是隻取出第二高薪水,若是將Limit設爲2,那麼就將第二高和第三高薪水都取出來。1060 msit
SELECT Salary AS SecondHighestSalary FROM Employee
GROUP BY SecondHighestSalary
UNION ALL(SELECT NULL AS SecondHighestSalary)
ORDER BY SecondHighestSalary DESC
LIMIT 1
OFFSET 1;
/*使用UNION ALL保證若是第二大的工資不存在,就返回null
LIMIT表示取返回結果的一個值
OFFSET表示從何處開始取
ORDER BY不能用Salary做爲條件,由於此時使用SecondHighestSalary標識*/table
【注】AS 子句可用來更改結果集列的名稱或爲派生列分配名稱。使用GROUP BY保證工資值不存在重複,因此也能夠使用DISTINCT排除重複的值。擴展
SELECT DISTINCT Salary SecondHighestSalary
FROM Employee
UNION ALL (SELECT NULL AS SecondHighestSalary)
ORDER BY SecondHighestSalary DESC
LIMIT 1
OFFSET 1;方法
② 能夠使用Max函數返回最大值,邏輯是咱們取出的不包含最大值的數字中的最大值,即爲第二大值。 1384 msim
SELECT MAX(Salary) As SecondHighestSalary FROM Employee
WHERE Salary NOT IN
(SELECT MAX(Salary) FROM Employee);數據
③ 就是用小於號<代替了Not in關鍵字,效果相同。914 ms
SELECT MAX(Salary) As SecondHighestSalary FROM Employee
WHERE Salary <
(SELECT MAX(Salary) FROM Employee);
④ 能夠擴展到找到第N高的薪水的方法,只要將下面語句中的1改成N-1便可,第二高的薪水帶入N-1就是1,下面語句的邏輯是,假如咱們要找第二高的薪水,那麼咱們容許其中一個最大值存在,而後在其他的數字中找出最大的,即爲整個的第二大的值;1421 ms
SELECT MAX(Salary) As SecondHighestSalary FROM Employee E1
WHERE 1 =
(SELECT COUNT(DISTINCT(E2.Salary)) FROM Employee E2
WHERE E2.Salary > E1.Salary);