SQL题目思路详解

101 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

题目链接:176. 第二高的薪水

题目描述:

image.png

题解:

主要考这么几个地方:

  • as解决别名问题
  • desc降序排序
  • limit 1,1选出第二高的薪水
select salary as SecondHighestSalary
from Employee
order by salary desc
limit 1,1
;

但是这样写会有两个问题,

  1. 一共一个数据的时候想让你返回null的时候,你返回不了。
  2. 就是有两个数据,但两个数据一样时,您还应该返回null。下面我们用了DISTINCT关键字解决这一问题

所以我们再改改:

方法一:

我们构建一个临时表:

SELECT
    (SELECT DISTINCT Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 , 1) AS SecondHighestSalary
;

方法二:

我们使用IFNULL关键字:

IFNULL(expr1,expr2)的用法:

假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

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

178. 分数排名

题目描述:

image.png

题解

首先最外面这层select用个降序是很简单的。

难点在于,如何去求自己的排名

我们这里的思路是,我们可以先提取出大于等于X的所有分数集合H,将H去重后的元素个数就是X的排名。比如你考了99分,但最高的就只有99分,那么去重之后集合H里就只有99一个元素,个数为1,因此你的Rank为1。

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

这途中还有一个小插曲,这个 rank因为变成你关键字了,所以老师报错。最后加上单引号解决了这一问题。唉。。。时代变了。