Employee 表:
id 是这个表的主键。
表的每一行包含员工的工资信息。
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。
查询结果如下例所示。
示例 1:
输入:
Employee 表:
输出:

示例 2:
输入:
Employee 表:

输出:
解析:
方法1:子查询
- SELECT max(salary) as SecondHighestSalary
- FROM Employee
- WHERE salary <
- ( SELECT max(salary)
- FROM Employee)
样例1:

样例2:

方法2: LIMIT 和 OFFSET 组合
- SELECT (
- SELECT DISTINCT salary
- FROM employee
- ORDER BY salary DESC
- LIMIT 1 OFFSET 1) as secondhighestsalary;
样例1:

样例2:

LIMIT:表示取数据的条数,OFFSET表示跳过的数量。
方法3:窗口函数 DENSE_RANK()
DENSE_RANK() 函数的语法如下:
DENSE_RANK() OVER (
PARTITION BY [{,...}]
ORDER BY [ASC|DESC], [{,...}]
)
在这个语法中:
PARTITION BY子句将FROM子句生成的结果集划分为分区。DENSE_RANK()函数应用于每个分区。ORDER BY 子句指定DENSE_RANK()函数操作的每个分区中的行顺序。如果分区具有两个或更多具有相同排名值的行,则将为这些行中的每一行分配相同的排名。
- SELECT max(salary) as SecondHighestSalary
- FROM
- (SELECT DISTINCT salary, DENSE_RANK() OVER (ORDER BY salary DESC) sale_rank
- FROM employee) new
- WHERE sale_rank = 2
样例1:

样例2:
注意:
力扣中投影的salary需要添加max函数,如果不添加max函数,在MySQL+Navicat下是正确的,但在力扣中则显示错误。

