LeetCode - 176. 第二高的薪水

Posted 碎羽love星谊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode - 176. 第二高的薪水相关的知识,希望对你有一定的参考价值。

  • 题目
    • 来源:力扣(LeetCode)
    • 描述

      编写一个 SQL 查询,获取 Employee?表中第二高的薪水(Salary)?。

      Id Salary
      1 100
      2 200
      3 300

      例如上述?Employee?表,SQL查询应该返回?200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

      SecondHighestSalary
      200
  • 题解
    • 解法一(MAX + 子查询)

      SELECT MAX(Salary) AS SecondHighestSalary
      FROM Employee
      where salary < (
      SELECT MAX(Salary)
      FROM Employee
      )
    • 解法二(limit + IFNULL + distinct)

      select IFNULL((
      select distinct e.Salary
      from Employee e
      order by e.Salary desc
      limit 1,1
      ),null) as SecondHighestSalary
    • 解法三(limit + distinct,其实可以不需要IFNULL!?)

      SELECT
      (SELECT DISTINCT
              Salary
          FROM
              Employee
          ORDER BY Salary DESC
          LIMIT 1 OFFSET 1) AS SecondHighestSalary
      • 解法四
        • 有点笨,先从大到小取出一、二名,然后再从小到大取出第一个。可能更适合其他更通用的场景?
        • 这里要注意内层查询中的limit 1,1和limit 0,2的效果不同,因为当只有一条数据时,1,1返回的是空集合,而0,2返回的是含有一条数据的集合,再给到上层查询再从小到大limit时,后者就会导致异常,不能返回null了。
      select IFNULL((
          select s.Salary as SecondHighestSalary
          from
          (select distinct e.Salary
          from Employee e
          order by e.Salary desc
          limit 1,1) s
          order by s.Salary asc
          limit 1
      ),null) as SecondHighestSalary
  • 考点
    • 特殊情况
      • 只有一条数据时,要返回null
      • Salary都相同的数据时,应该返回null,也就是说都认为是最大的值,而不能认为第二大的值也是该值
        • 可以在子查询中用distinct来处理
    • limit + distinct (IFNULL可用可不用)
      • 如果limit后面设置的范围超出数据总量,select语句返回的会是一个空集合,而不是含有null值的集合。如果想要返回null,那么就要外层再套一层select来取该列的值。所以其实可以不需要IFNULL!?
    • MAX

以上是关于LeetCode - 176. 第二高的薪水的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode--176--第二高的薪水

leetcode(176)第二高的薪水

LeetCode:176.第二高的薪水

LeetCode 176. 第二高的薪水(MySQL版)

LeetCode SQL 1669. 176. 第二高的薪水

LeetCode - 176. 第二高的薪水