题目(简单)
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
±—±-------+
| Id | Salary |
±—±-------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
±—±-------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
±--------------------+
| SecondHighestSalary |
±--------------------+
| 200 |
±--------------------+
解题思路(环境为MySQL数据库)
第一次提交的语句是
SELECT
Salary AS SecondHighestSalary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1, 1
这条语句在测试用例如下的时候是成功的:
{"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100], [2, 200], [3, 300]]}}
这里存在的问题是:
- 如果数据只有一条的时候没有按照要求返回null
- 如果出现两个最高分一样的情况下返回的也是不对的。也就是没有去重
下面的语句可以解决上面的问题:
SELECT
IFNULL(
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1, 1),
NULL
) AS SecondHighestSalary
这里有人可能会这样写:
SELECT
IFNULL(Salary,NULL) AS SecondHighestSalary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1, 1
认为这样就可以在Salary不存在的时候返回null。
这里我的理解是如果表中的数据只有一条的话,LIMIT1,1返回的数据条数为0,也就是没有返回任何数据,这时候去判断Salary存不存在也就没有意义了。