LeetCode - 176. 第二高的薪水
Posted 碎羽love星谊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode - 176. 第二高的薪水相关的知识,希望对你有一定的参考价值。
- 题目
- 来源:力扣(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
- 特殊情况
以上是关于LeetCode - 176. 第二高的薪水的主要内容,如果未能解决你的问题,请参考以下文章