LEETCODE数据库题目刷题(目前只有非会员的题目 😐),除了自己的题解还会整合大家的(10道题一个文档)
目前,非会员题目已经整理完 part 2 链接
LEETCODE数据库题库链接
176. 第二高的薪水
题目: 编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary) 。
Id | Salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
例如上述 Employee
表,SQL查询应该返回 200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null
。
SecondHighestSalary |
---|
200 |
SQL架构:
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')
解答:
1.利用 IFNULL
判断是否有第二高的薪水。
SELECT IFNULL((
SELECT distinct Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1), NULL) AS SecondHighestSalary
2.直接在正常查询的外面再套一层 select
,这样,如果没有第2低的就会返回 NULL
了 。
select(
select distinct salary
from Employee
order by salary desc
limit 1,1) as SecondHighestSalary
3.取比最高薪水低的薪水,就是第2高的薪水。
select distinct max(Salary) as SecondHighestSalary
from Employee
where Salary < (
select max(Salary)
from Employee)
177. 第N高的薪水
题目: 编写一个 SQL 查询,获取 Employee
表中第 n 高的薪水(Salary) 。
Id | Salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
例如上述 Employee
表,n = 2 时,应返回第二高的薪水 200
。如果不存在第 n 高的薪水,那么查询应返回 null
。
getNthHighestSalary(2) |
---|
200 |
题目框架:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
);
END
解答:
1.将 N
减去1,就可以用 LIMIT
了。
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
2.相较于1,判断了 N-1
的正负。
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N-1;
IF N < 0 THEN
RETURN NULL;
ELSE
RETURN (
# Write your MySQL query statement below.
SELECT IFNULL(
(
SELECT
DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N, 1
), NULL)
AS getNthHighestSalary
);
END IF;
END
3.自己和自己比较,查看排名。
select distinct Salary
from Employee e
where N = (
select count(distinct Salary)
from Employee
where Salary >= e.Salary ) # 相当于排了一次名
178. 分数排名
题目: 编写一个 SQL 查询来实现分数排名。
如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
Id | Score |
---|---|
1 | 3.50 |
2 | 3.65 |
3 | 4.00 |
4 | 3.85 |
5 | 4.00 |
6 | 3.65 |
例如,根据上述给定的 Scores
表,你的查询应该返回(按分数从高到低排列):
Score | Rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 2 |
3.65 | 3 |
3.65 | 3 |
3.50 | 4 |
重要提示: 对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 ‘Rank’。
SQL架构:
Create table If Not Exists Scores (Id int, Score DECIMAL(3,2))
Truncate table Scores
insert into Scores (Id, Score) values ('1', '3.5')
insert into Scores (Id, Score) values ('2', '3.65')
insert into Scores (Id, Score) values ('3', '4.0')
insert into Scores (Id, Score) values ('4', '3.85')
insert into Scores (Id, Score) values ('5', '4.0')
insert into Scores (Id, Score) values ('6', '3.65')
解答:
1.窗口函数。
select
Score,
dense_rank() over(order by Score desc)