- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用
目录
一,原题力扣链接
二,题干
Employee
表:+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ 在 SQL 中,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 | +---------------------+
三,建表语句
Create table If Not Exists Employee (id int, salary int)
Truncate table Employee
insert into Employee (id, salary) values ('1', '100')
insert into Employee (id, salary) values ('2', '200')
insert into Employee (id, salary) values ('3', '300')
四,分析
题解:
- 员工表 字段 员工id 和员工薪水
- 要求;薪水排名第二的薪水 如果第二高没有就返回null
咋一看这题很简单,其实有个坑在里面 第二高用limit很容易求出来 但是如果没有呢,所以还需要包上一层;
思路一 用limit 1 offset 1,来求
求之前 去重一下,保证薪水没有重复的
如果第二名没有,那么就返回null 很简单 加一个select就好
思路二,用开窗函数解答
第二种解法 ,用开窗求 统计函数可以求出 第二名的值
最后如果是null 就返回null 一九四select 套一下就好
五,SQL解答
解法一,去重+limit
select (
select distinct salary from employee order by salary desc limit 1,1
) as SecondHighestSalary;
解法二,窗口函数
select (
with t1 as (
select distinct *,
dense_rank() over(order by salary desc) ro
from Employee
)
select max(salary) as SecondHighestSalary from t1 where t1.ro =2
) as SecondHighestSalary
六,验证
七,知识点总结
- limit 取值练习,第一个是页数,第二个是数量;
- limit 后面可以跟上offset 也是范围取值;
- 窗口函数 row_number的用法;
- 最后这一题重点是造空值 null出来
- select可以快速造一个null值
- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用