Leetcode MySQL第176题:查询第二高的薪水
先看题目:
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)
比较简单且在日常工作中应用频率比较高的要求,重点注意:
(1)可能有多个相同的薪水,注意去重
(2)当没有第二高的值时需要返回NULL值
方法1
思路:取出最大值,在小于最大值的情况下再取一次最大值
优点:可读性高,代码简洁
缺点:不易修改,继续取第N高值时只能继续嵌套子查询,后面会变得极度臃肿。
效率:192 ms,效率为三种方法中最慢
SELECT MAX(Salary) AS SecondHighestSalary
FROM Employee
WHERE Salary<(
SELECT MAX(Salary)
FROM Employee)
方法2
思路:排序,然后利用偏移取出排名第二的值
优点:效率高,易修改,可十分方便取出第N高的值
缺点:需嵌套IFNULL函数,不然无法返回出NULL值,降低了可读性
效率:156 ms,三种方法中最快
注意:需要使用DISTINCT去重
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
方法3
思路:使用窗口函数RANK()排序,取RANK=2的值
优点:易修改,方便取第N高的值
缺点:可读性不高,效率上较第二种方法无优势,主要锻炼窗口函数的应用
效率:166 ms,效率为第二快
注意:需要使用DISTINCT去重
SELECT
IFNULL(
(SELECT DISTINCT Salary FROM (SELECT *,RANK() OVER(ORDER BY Salary DESC) AS `rank` FROM Employee) AS t1 WHERE `rank` = 2),
NULL) AS SecondHighestSalary