SQL 问题汇总

6种方案诠释MySQL通用查询策略

175. 组合两个表

select FirstName, LastName, City, State 
from Person left join Address 
on Person.PersonId = Address.PersonId;

在这里插入图片描述

176. 第二高的薪水

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

在这里插入图片描述

177. 第N高的薪水

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare M int;
set M:=N-1;
  RETURN (
      # Write your MySQL query statement below.
      select IFNULL(
          (select distinct Salary from Employee order by Salary desc limit 1 offset M),
          null
      )
  );
END

注意两点:

  1. limit 1 offset Mlimit M, 1 等价
  2. declare M int; set M:=N-1;要写在BEGINRETURN之间

在这里插入图片描述

178. 分数排名

好理解的做法:

select 
    a.Score as score , 
    (select count(distinct b.Score) from Scores b where b.Score >=a.Score) as `rank`
from Scores a order by Score DESC;

新开一列,用select count(distinct b.Score) from Scores b where b.Score >=a.Score表示序号

窗口函数做法:

select 
score,
dense_rank() over (order by score desc) as `rank`
from Scores;

窗口函数:

  • rank
  • dense_rank
  • row_number

图解SQL面试题:经典排名问题

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值