leetcode刷题 (数据库 MySQL) Part 1

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')

leetcode链接

解答:

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

leetcode链接

解答:

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')

leetcode链接

解答:

1.窗口函数。

select
    Score,
    dense_rank() over(order by Score desc) 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值