前言
LeetCode死磕系列十: SQL
作为一个后端开发程序员,SQL功底还是很重要的!!!
所以还是要练习。
还记得去年被字节面试的时候,连SQL都写不出来。。。
LeetCode SQL题目整理
刷了LC上的top70之后,感觉考察最多的还是多表的联合查找,毕竟实际中也不会仅仅是单表的查询。
主要题型:
- TOP N 问题
- 排名问题
- 滑动窗口
- 自链接问题
题解
TOP N问题
176. 第二高的薪水
思路:
使用limit
注意判空、去重
select ifnull ((select distinct Salary from Employee order by Salary desc limit 1, 1) , null) as SecondHighestSalary;
- 先使用max查询最高的薪水 max,之后再通过自查询,查询小于max的max
184. 部门工资最高的员工
-- 思路: 寻找最大薪资的数据
-- join
-- 1. 直接join group by 选取最大的即可 但是 无法保证最大的薪资不重复 失败
-- 2. 先通过员工信息 寻找最大的薪资+id 的数据A,然后再join 两张表,将A中对应的数据返回
-- 1.
select
d.Name as Department,
e.Name as Employee,
e.Salary as Salary
from
Employee e inner join Department d on e.DepartmentId = d.Id
where
(e.DepartmentId, e.Salary) in
(select
DepartmentId,
max(Salary)
from
Employee
group by
DepartmentId);
177. 第N高的薪水
LIMIT PAGE, OFFSET
跳过 PAGE * OFFSET条数据,接下来的offset条数据, 因为题目中未说明薪资是否不重复,所以还需要使用distinct去重
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N:= N-1;
RETURN (
# Write your MySQL query statement below.
select
distinct Salary
from
Employee
order by
Salary desc
limit N,1
);
END
185. 部门工资前三高的所有员工
select d.Name as Department,
e2.Name as Employee,
e2.Salary from
Department d inner join
(
select e.*,
dense_rank() over(partition by DepartmentID
Order by Salary DESC) as 'rank'
from Employee e
) e2 on d.Id= e2.DepartmentID
where e2.rank<=3
order by Department AND Salary
排名问题
178.分数排名
select
Score, dense_rank() over(order by Score desc) as `Rank`
from Scores;
自链接问题
603. 连续空余座位
-- 几个朋友来到电影院的售票处,准备预约连续空余座位。
-- 你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗?
select distinct a.seat_id
from cinema a join cinema b
on abs(a.seat_id - b.seat_id) = 1
and a.free = true and b.free = true
order by a.seat_id