力扣sql刷题记录--第二高薪水

题目:

Employee 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。

查询并返回 Employee 表中第二高的 不同 薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。

查询结果如下例所示。

示例 1:

输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

示例 2:

输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null                |
+---------------------+

法1:

思路:先找出salary中的最大值,再用过滤的方法把最大值过滤掉,再取最大值

SELECT MAX(SALARY) AS SecondHighestSalary
FROM EMPLOYEE
WHERE SALARY < (SELECT MAX(SALARY) FROM EMPLOYEE) 
#在WHERE条件中使用子查询时,子查询必须用括号括起来

逻辑分解:

1.子查询部分(SELECT MAX(salary) FROM Employee)先执行,找出表中最高工资

2.主查询WHERE条件,过滤出小于最大薪资的值,如果只有一条数据,将会过滤掉所有记录,主查询也就是在空的集合上操作,所以返回null

3.主查询SELECT,在过滤后的记录中找出最大值,就是第二高工资。

方法2:使用IFNULL和LIMIT子句

IFNULL(A,B)指的是如果A为NULL时返回B

思路:先查询不重复的SALARY,然后对其逆向排序,再取排序后的第二个数并命名为

SecondHighestSalary,使用IFNULL,当查询是空的时候返回NULL

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

方法三

构建临时表以满足结果为NULL

使用子查询作为临时表会返回NULL,如果直接查询,会返回空结果集,但如果把子查询作为临时表,当子查询不返回任何行时,未曾的SELECT会将其视为NULL值,这种特性在实际应用中很重要。

SELECT(
SELECT DISTINCT SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC
LIMI 1 OFFSET 1
) AS SecondHighestSalary

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值