【刷题记录】2.第二高的薪水

151 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>SQL架构>176. 第二高的薪水

Employee 表:

Column NameType
idint
salaryint

id 是这个表的主键。 表的每一行包含员工的工资信息。

编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。

查询结果如下例所示。
示例 1:
输入:
Employee 表:

idsalary
1100
2200
3300

输出:

SecondHighestSalary
200

示例 2:
输入:
Employee 表:

idsalary
1100

输出:

SecondHighestSalary
null

二、思路分析:

  1. 题目需要求得第二高的薪水,必然会涉及到排序,使用order by(升序asc,降序desc),求第二高则使用desc降序排列
  2. 在排序的基础上,自然会想到使用limit 1,1获取第二条数据作为第二高薪水
  3. 当出现多个重复数据,例如多个人并列第一薪水时,此时使用limit 1,1取第二条数据显然是不对的,取出来的数是第一薪水
  4. 当只有一条数据时,使用limit 1,1是取不出数据的,题意要求的此时取出结果需要显示null,则需要使用关键字IFNULL
  5. 输出的数据是有名称的,此时需要使用到的关键字为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条数据

四、总结:

  1. 此题目比较基础,涉及排序(ASC、DESC),取指定数据(LIMIT),取别名(AS),空数据替换(IFNULL)的使用
  2. 延伸内容:limit a,b与limit a offset b的区别
  3. 加油共勉