【LeetCode-SQL每日一练】——2. 第二高的薪水

举报
超梦梦梦梦 发表于 2022/03/21 22:26:36 2022/03/21
【摘要】 大家好呀,我是超梦梦梦梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好SQL,那少不了每天的练习与学习。接下来小梦会带领小伙伴们一起每天刷一道LeetCode-数据库(SQL)相关的题目,然后在文章后例举相关知识点帮助小伙伴们学习与巩固,更好的掌握SQL。

🎈写在前面

  🙋‍♂️大家好呀,我是超梦梦梦梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的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原题地址,点击进入~


解题思路

方式一

  1. 首先我们先写一个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;

方式二

  1. 首先我们将salary字段进行降序排序。
  2. 通过distinct将alary中的值去重。这里可能会有小伙伴们问了,employee表中salary没有重复的值呀为什么要加去重操作?小梦跟小伙伴们说一下,题目表中数据量很少,当数据量大的时候我们不能保证没有相同数据。当出现重复数据而我们没有进行去重操作,那我们通过降序排序也无法判断第二高的数据在哪一位置。当进行去重操作后,我们通过降序排序就能很清楚的知道第二高的数据就是排在第二位。所以为了谨慎与正确性,我们需要加上distinct。
  3. 通过以上去重排序操作后,我们很清楚的知道第二高的薪水就是排在第二位,再通过limit 1,1或者limit 1 offset1来查询出第二高的薪水。(limit1,1:前面的那一个1意思是跳过一条数据,后面的1是取一个数据,意思就是跳过一个数据,从第二条数据开始取一条数据。)(limit 1 offset 1:前面那个1意思是取一个数据,后面那一个1是跳过一条数据,整个意思就是跳过一个数据,从第二条数据开始取一条数据。
  4. 接下来我们根据题意还需要做一个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的知识点,要常常温故而知新~

  1. limit n 分句表示: 读取 n 条数据
  2. limit n, m 分句表示: 跳过 n 条数据,读取 m 条数据
  3. limit n 等价于 limit 0,n
  4. limit m offset n 分句表示: 跳过 n 条数据,读取 m 条数据

ifnull函数

通过今天这一题,相信小伙伴们对ifnull函数也有些认识了。

ifnull(expression ,y)函数解释:

如果第一个参数的表达式 expression 为 NULL,则返回第二个参数y的值(此题中是返回null值)。

如果第一个参数的表达式 expression 为 不为NULL,则返回第一个参数表达式expression的值。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。