写在前面
♂️大家好呀,我是超梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好SQL,那少不了每天的练习与学习。接下来小梦会带领小伙伴们一起每天刷一道LeetCode-数据库(SQL)相关的题目,然后在文章后例举相关知识点帮助小伙伴们学习与巩固,更好的掌握SQL。
♂️ 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问,小梦定知无不言,言无不尽。
目录
题目概述
解题思路
方式一
方式二
力扣官方解析
代码实现
知识点总结
limit子句
ifnull函数
Employee
表Employee 表 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
题目:
- 编写一个 SQL 查询,获取
Employee
表中第二高的薪水(Salary),如果不存在第二高的薪水,那么查询应返回null
。- 例如上述
Employee
表,SQL查询应该返回200
作为第二高的薪水。+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
LeetCode原题地址,点击进入~
- 首先我们先写一个select查询语句,查出Employee表中最高的薪水。
select max(salary) from Employee;
2. 然后我们把第一步的查询语句作为一个子句,我们通过where条件,使salary小于该子句得到的最高薪水。简单来讲就是我查询到一个小于最高的薪水的最高薪水,不就是第二高薪水嘛。
select max(salary) from Employee where salary < (select max(salary) from Employee);
3. 接下来我们根据题意还需要做一个null判断,如果不存在第二高薪水,就返回null值。这里我们用到了ifnull函数(文章知识点总结部分会有对ifnull函数的讲解哦~)。
题解:
select ifnull(( select max(salary) from Employee where salary < (select max(salary) from Employee)),null) as SecondHighestSalary;
- 首先我们将salary字段进行降序排序。
- 通过distinct将alary中的值去重。这里可能会有小伙伴们问了,employee表中salary没有重复的值呀为什么要加去重操作?小梦跟小伙伴们说一下,题目表中数据量很少,当数据量大的时候我们不能保证没有相同数据。当出现重复数据而我们没有进行去重操作,那我们通过降序排序也无法判断第二高的数据在哪一位置。当进行去重操作后,我们通过降序排序就能很清楚的知道第二高的数据就是排在第二位。所以为了谨慎与正确性,我们需要加上distinct。
- 通过以上去重排序操作后,我们很清楚的知道第二高的薪水就是排在第二位,再通过limit 1,1或者limit 1 offset1来查询出第二高的薪水。(limit1,1:前面的那一个1意思是跳过一条数据,后面的1是取一个数据,意思就是跳过一个数据,从第二条数据开始取一条数据。)(limit 1 offset 1:前面那个1意思是取一个数据,后面那一个1是跳过一条数据,整个意思就是跳过一个数据,从第二条数据开始取一条数据。)
- 接下来我们根据题意还需要做一个null判断,如果不存在第二高薪水,就返回null值。
题解:
##limit select ifnull( (select distinct Salary from Employee order by Salary desc limit 1,1), null) as SecondHighestSalary; ## limit offset select ifnull( (select distinct Salary from Employee order by Salary desc limit 1 offset 1), null) as SecondHighestSalary;
方法一:使用子查询和 LIMIT 子句
将不同的薪资按降序排序,然后使用 LIMIT 子句获得第二高的薪资。
SELECT DISTINCT Salary AS SecondHighestSalary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1
然而,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表。
SELECT (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1) AS SecondHighestSalary
方法二:使用 IFNULL 和
LIMIT
子句SELECT IFNULL( (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1), NULL) AS SecondHighestSalary
方式一
select ifnull((
select max(salary) from Employee
where
salary < (select max(salary) from Employee)),null)
as SecondHighestSalary;
方式二
limit
select
ifnull(
(select distinct Salary
from Employee
order by Salary desc
limit 1,1),
null) as SecondHighestSalary;
输出与预期结果一致,答题成功!
limit offset
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
输出与预期结果一致,答题成功!
我们来简单回顾一下limit与limit offset的知识点,要常常温故而知新~
- limit n 分句表示: 读取 n 条数据
- limit n, m 分句表示: 跳过 n 条数据,读取 m 条数据
- limit n 等价于 limit 0,n
- limit m offset n 分句表示: 跳过 n 条数据,读取 m 条数据
通过今天这一题,相信小伙伴们对ifnull函数也有些认识了。
ifnull(expression ,y)函数解释:
如果第一个参数的表达式 expression 为 NULL,则返回第二个参数y的值(此题中是返回null值)。
如果第一个参数的表达式 expression 为 不为NULL,则返回第一个参数表达式expression的值。