力扣 176. 第二高的薪水

题目说明

SQL架构

1
2
3
4
5
Create table If Not Exists Employee (id int, salary int)
Truncate table Employee
insert into Employee (id, salary) values ('1', '100')
insert into Employee (id, salary) values ('2', '200')
insert into Employee (id, salary) values ('3', '300')

编写一个 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 |
+---------------------+

笔者理解

此题是一道SQL算法问题,在力扣题库中被定义为中等题。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
# Write your MySQL query statement below

# 外层嵌套循环来实现题目要求的 "如果不存在第二高的薪水,那么查询应返回 null"
select (
# 因为薪水可能出现重复的,所以这里采用 distinct 来取薪水的唯一值
select distinct salary
from Employee
# 获取第二高,所以采用 order by 进行排序,且采用 desc 降序排序
order by salary desc
# 取第二条数据(1, 1 表示从第 2 条数据开始取一条数据,MySQL 数据第 0 行才是第 1 条数据)
limit 1, 1
)
as SecondHighestSalary

时间和空间效率还行,可见此解法还比较适合此题。

image-20211228113424399

总结

本题是今天的一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。