• LeetCode


    • 题目

      • 来源:力扣(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
  • 相关阅读:
    Spring Boot 应用监控
    学习学习SpringSecurity
    Spring Cloud 简介
    thinkphp 请求
    八、主从复制
    七、AOF 持久化
    五、五大数据类型实现原理
    六、RDB 持久化
    四、redis的底层数据结构
    三、五大数据类型详细用法
  • 原文地址:https://www.cnblogs.com/wyp1988/p/12101160.html
Copyright © 2020-2023  润新知