LeetCode-176. 第二高的薪水( Combine Two Tables),每天一条sql训练。

本文介绍如何使用SQL查询获取Employee表中的第二高薪水,通过ORDER BY和LIMIT子句结合DISTINCT进行排序和筛选,解决没有第二高薪水的情况,提供两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/second-highest-salary

解题:

首先应该对工资排序,这样才能确认第二高的工资,所以首先要用到 Order by子句,然后使用LIMIT子句选择,要用到distinct

SELECT DISTINCT
    Salary AS SecondHighestSalary
FROM
    Employee
ORDER BY Salary DESC
LIMIT 1 , 1

上面的简答存在的问题:如果没有第二最高工资,本表可能只有一项记录。为了克服这个问题,可以将其作为临时表。

SELECT
    (SELECT DISTINCT
            Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET 1) AS SecondHighestSalary

第二种方法:

用“IFNULL” 函数处理可能为空的问题。如果结果为空则返回null.

SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) AS SecondHighestSalary

ifnull()函数:

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

IFNULL(expression, alt_value)
如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值。

临时表:

首先,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。

 

AS:

设置别名,可省略

 ORDER BY 子句:

将查询数据排序后再返回数据

可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。

可以设定多个字段来排序。

可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列(例如数字,小数在前面)。

DESC :降序

SELECT Company, OrderNumber FROM Orders ORDER BY Company,OrderNumber DESC

可以添加 WHERE...LIKE 子句来设置条件。

DISTINCT:

关键词 DISTINCT 用于返回唯一不同的值。

SELECT DISTINCT Company FROM Orders 

LIMIT子句:

来约束结果集中的行数.

LIMIT子句接受一个或两个参数。两个参数的值必须为零或正整数。

SELECT 
    *
FROM
    table
LIMIT offset(从什么位置开始) , count(要显示几行);

使用带有一个参数的LIMIT子句时,此参数将用于确定从结果集的开头返回的最大行数。可用LIMIT子句来选择表中的前N行记录:

SELECT 
    *
FROM
    table
LIMIT count;

等价

SELECT 
    *
FROM
    table
LIMIT 0,count;

LIMIT子句经常与ORDER BY子句一起使用。用来查询最高或者最低值,也可以查询第n高值,例如本题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值