LeetCode:176.第二高的薪水

题目链接:https://leetcode-cn.com/problems/second-highest-salary/

题目

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

+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+

解答

第一次解答报错。。。

---- oracle ----
/* Write your PL/SQL query statement below */
select Salary as SecondHighestSalary
from
(
    select Salary,
           rownum as rn
    from
    (
        select Salary
        from Employee
        order by Salary desc
    ) b
) c
where c.rn = 2 ---- 执行报错 当数据只有1行时 执行为空 而不是null

第二次解答。。。依旧报错

---- oracle ----
/* Write your PL/SQL query statement below */
select Salary as SecondHighestSalary
from
(
    select Salary,
           row_number() over(order by Salary desc) as rn
    from Employee
) c
where c.rn = 2  ---- 依旧报错

参考评论之后,再改进。。

解答一

---- oracle ----
/* Write your PL/SQL query statement below */
select max(Salary) as SecondHighestSalary
from Empolyee
where Salary <> (select max(Salary) from Employee) ---- 672ms

解答二

修改第一次出错的版本,添加判断后再次尝试。。。

---- oracle ----
select Salary as SecondHighestSalary
from
(
    select Salary
    from
    (
        select Salary,
               rownum as rn
        from
        (
            select distinct(Salary)
            from Employee
            order by Salary desc
        ) b
    ) c
    where c.rn = 2
    union all
    select null from dual
)
where rownum = 1  -- 未针对薪水进行去重操作 增加distinct
-- 不添加distinct还执行报错 添加之后通过
---- 861ms

解答三

好久没用过MySQL,用法都忘光了。。

使用子查询和LIMIT子句

---- MySQL ----
select
(
    select distinct Salary
    from Employee
    order by Salary desc
    limit 1 offset 1
) as SecondHighestSalary; ---- 112ms 好快

解答四

为了解决NULL的问题,可以使用IFNULL函数

---- MySQL ----
select
ifnull(
    (
    select distinct Salary
    from Employee
    order by Salary desc
    limit 1 offset 1
    ),
NULL) as SecondHighestSalary  ---- 108ms

思考

去重、排序、获取第二个、返回为NULL时设置返回NULL

注意

oracle中rownum的使用必须要包含第一条记录,也就是类似rownum <= 10,所以不能使用rownum = 2提取第2行数据,必须利用嵌套查询实现。

group by的速度比distinct速度要快。

原文地址:https://www.cnblogs.com/hider/p/11721172.html

时间: 2024-10-09 23:43:18

LeetCode:176.第二高的薪水的相关文章

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

0.前言 最近刷LeetCode 刷数据库题目 由于数据库课上的是SQL,而MySQL有许多自己的函数的,怕把刚学会的函数忘记 特在此记录! 1.题目 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,SQL查询应该返回 200 作

176. 第二高的薪水

Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ For example, given the above Employee table, the query should return 200 a

力扣——第二高的薪水(数据库的题

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水.如果不存在第二高的薪水,那么查询应返回 null. +---------------------+ | SecondHighestSal

LeetCode176——第二高的薪水

题目描述 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水.如果不存在第二高的薪水,那么查询应返回 null. +---------------------+ | SecondHighe

mysql--单表中筛选出第二高的薪水

思路一:(最终的结果如果不存在第二高的薪水的话不会返回null)  无论是是使用哪种方法,最终在select后面都要跟一个distinct做到去重的效果 思路二:(解决不能返回null的问题) 方法一:使用子查询结合limit 方法二:使用IFNULL结合limit 补充: 1.对limit的基本使用规范 2.select 后面如果跟一个为空的结果集,最终输出的结果为null 原文地址:https://www.cnblogs.com/vegetableDD/p/11575104.html

数据库专题-leetcode176. 第二高的薪水

题目及分析 题目 题目解析 第二高的薪酬:1.需要排序 order by 2.会有薪酬重复的情况,需要去重 distinct 3.需要取指定行数据 limit 没有第二高的时候设置为null:判断语句,可以使用ifnull 所以:1.先查出按薪酬降序的不重复第二条数据(当不重复数据只有1条或者0条时候,此时结果集为空) 2.使用ifnull函数,将结果输出 结果示例 select ifnull( ( select distinct e.Salary from Employee e order b

[LeetCode] Second Highest Salary 第二高薪水

Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ For example, given the above Employee table, the second highest salary is 

mysql 第二高薪水

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水.如果不存在第二高的薪水,那么查询应返回 null. +---------------------+ | SecondHighestSalar

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

问题描述: 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水.如果不存在第二高的薪水,那么查询应返回 null. +---------------------+ | SecondHigh