题目描述

编写一个SQL查询,获取Employee表中第二高的薪水(Salary)。

1
2
3
4
5
6
7
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+

例如上述Employee表,SQL查询应该返回200作为第二高的薪水,如果不存在第二高的薪水,那么查询应该返回null.

1
2
3
4
5
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+

解法

先对Salary去重,防止相等的数据对后面查询造成干扰,根据Salary进行降序排序,然后使用limit关键字略过第一条信息,得到第二条信息则得到的即为第二高的薪水。

1
2
3
SELECT DISTINCT Salary AS SecondHighestSalary 
FROM Employee ORDER BY Salary DESC
LIMIT 1, 1;
  • DESC(descend) 降序排列;ASC(ascend) 升序排列;
  • DISTINCT 去重(两边不需要带括号👻)
  • LIMIT Y OFFSET X 和 LIMIT X, Y 都表示掠过前X条数据,取第Y条数据(基1👀)

如果未查询到结果,需要返回null,使用哦个ifnull进行判断;

1
2
3
4
5
SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee ORDER BY Salary DESC
LIMIT 1, 1), NULL)
AS SecondHighestSalary ;

IFNULL(X, Y) 如果X为null则返回Y,否则返回X。这里的AS要放到IFNULL语句之后!!!

参考