Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>SQL架构>176. 第二高的薪水
Employee 表:
| Column Name | Type |
|---|---|
| id | int |
| salary | int |
id 是这个表的主键。
表的每一行包含员工的工资信息。
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。
查询结果如下例所示。
示例 1:
输入:
Employee 表:
| id | salary |
|---|---|
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
输出:
| SecondHighestSalary |
|---|
| 200 |
示例 2:
输入:
Employee 表:
| id | salary |
|---|---|
| 1 | 100 |
输出:
| SecondHighestSalary |
|---|
| null |
二、思路分析:
- 题目需要求得第二高的薪水,必然会涉及到排序,使用order by(升序asc,降序desc),求第二高则使用desc降序排列
- 在排序的基础上,自然会想到使用limit 1,1获取第二条数据作为第二高薪水
- 当出现多个重复数据,例如多个人并列第一薪水时,此时使用limit 1,1取第二条数据显然是不对的,取出来的数是第一薪水
- 当只有一条数据时,使用limit 1,1是取不出数据的,题意要求的此时取出结果需要显示null,则需要使用关键字IFNULL
- 输出的数据是有名称的,此时需要使用到的关键字为AS
三、AC 代码:
SELECT ifnull(( SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1, 1 ),
NULL
) AS seconSecondHighestSalary
limit也有其他类似的写法,此解法可以使用limit 1 offset 1替换,代码如下:
SELECT ifnull(( SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1 ),
NULL
) AS seconSecondHighestSalary
此处延伸出limit a,b与limit a offset b的区别:
limit a,b表示跳过前面a条,取b条数据
limit a offset b表示跳过前面b条,取a条数据
四、总结:
- 此题目比较基础,涉及排序(ASC、DESC),取指定数据(LIMIT),取别名(AS),空数据替换(IFNULL)的使用
- 延伸内容:limit a,b与limit a offset b的区别
- 加油共勉