持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
题目链接:176. 第二高的薪水
题目描述:
题解:
主要考这么几个地方:
- as解决别名问题
- desc降序排序
- limit 1,1选出第二高的薪水
select salary as SecondHighestSalary
from Employee
order by salary desc
limit 1,1
;
但是这样写会有两个问题,
- 一共一个数据的时候想让你返回null的时候,你返回不了。
- 就是有两个数据,但两个数据一样时,您还应该返回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. 分数排名
题目描述:
题解
首先最外面这层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因为变成你关键字了,所以老师报错。最后加上单引号解决了这一问题。唉。。。时代变了。