写在前面
♂大家好呀, 我是超梦. 小伙伴们都知道, 不管是在学习中还是日常工作中, 几乎天天是要跟数据库打交道的, 为了更好的操作数据库, 我们的 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 与 limit offset 的知识点, 要常常温故而知新~
limit n 分句表示: 读取 n 条数据
limit n, m 分句表示: 跳过 n 条数据, 读取 m 条数据
limit n 等价于 limit 0,n
limit m offset n 分句表示: 跳过 n 条数据, 读取 m 条数据
ifnull 函数
通过今天这一题, 相信小伙伴们对 ifnull 函数也有些认识了.
ifnull(expression ,y)函数解释:
如果第一个参数的表达式 expression 为 NULL, 则返回第二个参数 y 的值(此题中是返回 null 值).
如果第一个参数的表达式 expression 为 不为 NULL, 则返回第一个参数表达式 expression 的值.
来源: https://blog.csdn.net/weixin_42306958/article/details/122530971