题目

SQL 架构

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) 。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

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

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

题解一:使用 limit

回忆一下 limit 的用法

limit N     # 返回 N 条记录
offset M    # 跳过 M 条记录,M 默认为 0
limit M,N   # 相当于 limit N offset M,从第 M 条记录开始,返回 N 条记录

将 Salary 去重降序排列,再返回第二条记录可得第二大的值
也许只有一个 Salary 值,将返回 null

select (
	select DISTINCT Salary
	from Employee
	order by Salary DESC
	limit 1,1) 
as SecondHighestSalary;

题解二:使用 max 函数

回忆一下 max 的用法

max(字段名)  # 返回该字段的最大值

找出小于该字段最大值最大值,即为第二大值

select max(Salary) as SecondHighestSalary 
from Employee
where Salary < (
    select max(Salary) from Employee
);