题目
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
±—±-------+
| Id | Salary |
±—±-------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
±—±-------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
±--------------------+
| SecondHighestSalary |
±--------------------+
| 200 |
±--------------------+
解决方法
-
解法一
select max(Salary) AS SecondHighestSalary from Employee where Salary < (select max(Salary) from Employee)
-
解法二
select max(Salary) AS SecondHighestSalary from Employee where Salary < ( select Salary from Employee order by Salary DESC limit 1 )
这种方法和解法一用法类似,但是我在提交解法一的执行用时解法二慢一点,但是我
explain
一下发现解法二使用order
by是会出现Using filesort
的,这种情况正常来说是比较糟糕的情况,至于为啥能更快一点,我不得而知,还请大佬们赐教. -
解法三
select IFNULL((SELECT distinct Salary from Employee order by Salary desc limit 1 offset 1),NULL) as SecondHighestSalary
IFNULL
的使用方法是SELECT IFNULL(A,B)
如果A不为NULL
的话会显示A,否则显示B