-
题目
-
来源:力扣(LeetCode)
-
描述
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
Id Salary 1 100 2 200 3 300 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
SecondHighestSalary 200
-
-
题解
-
解法一(MAX + 子查询)
SELECT MAX(Salary) AS SecondHighestSalary FROM Employee where salary < ( SELECT MAX(Salary) FROM Employee )
-
解法二(limit + IFNULL + distinct)
select IFNULL(( select distinct e.Salary from Employee e order by e.Salary desc limit 1,1 ),null) as SecondHighestSalary
-
解法三(limit + distinct,其实可以不需要IFNULL!?)
SELECT (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1) AS SecondHighestSalary
- 解法四
- 有点笨,先从大到小取出一、二名,然后再从小到大取出第一个。可能更适合其他更通用的场景?
- 这里要注意内层查询中的limit 1,1和limit 0,2的效果不同,因为当只有一条数据时,1,1返回的是空集合,而0,2返回的是含有一条数据的集合,再给到上层查询再从小到大limit时,后者就会导致异常,不能返回null了。
select IFNULL(( select s.Salary as SecondHighestSalary from (select distinct e.Salary from Employee e order by e.Salary desc limit 1,1) s order by s.Salary asc limit 1 ),null) as SecondHighestSalary
- 解法四
-
-
考点
- 特殊情况
- 只有一条数据时,要返回null
- Salary都相同的数据时,应该返回null,也就是说都认为是最大的值,而不能认为第二大的值也是该值
- 可以在子查询中用distinct来处理
- limit + distinct (IFNULL可用可不用)
- 如果limit后面设置的范围超出数据总量,select语句返回的会是一个空集合,而不是含有null值的集合。如果想要返回null,那么就要外层再套一层select来取该列的值。所以其实可以不需要IFNULL!?
- MAX
- 特殊情况