当前位置:网站首页>【LeetCode-SQL每日一练】——2. 第二高的薪水
【LeetCode-SQL每日一练】——2. 第二高的薪水
2022-07-31 05:08:00 【m0_67401920】
??写在前面
??*大家好呀,我是超梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好SQL,那少不了每天的练习与学习。接下来小梦会带领小伙伴们一起每天刷一道LeetCode-数据库(SQL)相关的题目,然后在文章后例举相关知识点帮助小伙伴们学习与巩固,更好的掌握SQL。
??* 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问,小梦定知无不言,言无不尽。
目录
题目概述
?Employee
表Employee 表 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
题目:
??编写一个 SQL 查询,获取
Employee
表中第二高的薪水(Salary),如果不存在第二高的薪水,那么查询应返回null
。例如上述
Employee
表,SQL查询应该返回200
作为第二高的薪水。±--------------------+
| SecondHighestSalary |
±--------------------+
| 200 |
±--------------------+
解题思路
方式一
首先我们先写一个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的值。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
一文了解大厂的DDD领域驱动设计
pycharm专业版使用
110道 MySQL面试题及答案 (持续更新)
110 MySQL interview questions and answers (continuously updated)
The MySQL database installed configuration nanny level tutorial for 8.0.29 (for example) have hands
MySQL forgot password
Moment Pool Cloud quickly installs packages such as torch-sparse and torch-geometric
Temporal客户端模型
【debug锦集】Expected input batch_size (1) to match target batch_size (0)
Centos7 install mysql5.7
随机推荐
centos7安装mysql5.7步骤(图解版)
三道leetcode上的oj题
<urlopen error [Errno 11001] getaddrinfo failed>的解决、isinstance()函数初略介绍
The 15th day of the special assault version of the sword offer
110 MySQL interview questions and answers (continuously updated)
ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)Solution
Linux系统安装mysql(rpm方式安装)
ABC D - Distinct Trio(k元组的个数
Lua,ILRuntime, HybridCLR(wolong)/huatuo hot update comparative analysis
一文了解大厂的DDD领域驱动设计
ABC D - Distinct Trio (Number of k-tuples
Heavyweight | The Open Atomic School Source Line activity was officially launched
MySQL_关于JSON数据的查询
Sql解析转换之JSqlParse完整介绍
Interview | Cheng Li, CTO of Alibaba: Cloud + open source together form a credible foundation for the digital world
[Linear Neural Network] softmax regression
mysql存储过程
mysql stored procedure
Centos7 install mysql5.7 steps (graphical version)
面试官竟然问我怎么分库分表?幸亏我总结了一套八股文