0%

176.第二高的薪水

1. 找出最大值,再从小于最大值的值中找出最大值

1
2
3
select max(Salary) as SecondHighestSalary
from Employee
where Salary < (select max(Salary) from Employee)

这种方法的优点是如果存在第二大的,则一定能返回;如果不存在,则会返回null。
缺点是难以处理第3, 4, 5…大的数据。

2. limitoffset

limit可以限制结果的条数,offset是跟limit连用的,可以限制limit开始的位置。
如数据为1,2,3,4,5,limit 2获得的是1,2,而如果limit 2 offset 1返回的就是2,3,开始limit的位置向后偏移了1位。
另外,limit m offset n可以写成limit n, m
如果offset超出了数据范围,则不会报错,结果会得到空集,代表0条记录,而不是结果为null。

1
2
3
4
select distinct Salary as SecondHighestSalary
from Employee
order by Salary desc
limit 1 offset 1

上述代码的问题是,当不存在第二大的值时,如仅有数据为2,offset超出范围,返回的结果是空集,而不是题目中要求的null。
为了解决这个特殊情况,使用IFNULL(expression, alt_value)函数,当expression为null时返回alt_value,当expression不为null时,返回expression。
修改上述代码为:

1
2
3
4
5
select ifnull(
(select distinct Salary
from Employee
order by Salary desc
limit 1 offset 1), null) as SecondHighestSalary;