题目:
分析:
首先看题目,我们需要解决这么几个问题:
- 找到第二高(当然了有可能几条数据的薪水一样,所以注意去重)
- 如果没有第二高,返回null
- 仅返回一条数据
接下来,我们一个一个的解。
题解:
第一步,我们需要找到第二高的薪水。
如何找到第二高的薪水呢?首先要找到第一高的薪水,然后才能找到第二高的薪水。
所以先找第一高的薪水,即薪水递减,取第一条数据:
select Salary
from Employee
order by Salary desc
limit 1
但是薪水可能有相同值,所以要去重:
select distinct(Salary)
from Employee
order by Salary desc
limit 1
这样我们就得到了第一高的薪水的值,而且该sql返回的数据是去重过的、递减的。那么第二高的薪水肯定是排在第一后面的呀~所以:
select distinct(Salary)
from Employee
order by Salary desc
limit 1,1
至此,我们找到了第二高的薪水。
第二步,但是,题目中还要求,如果没有找到第二高薪水,是要返回null的,所以我们加上判断:
select IFNULL(
(
select distinct(Salary)
from Employee
order by Salary desc
limit 1,1
),null) as SecondHighestSalary
这样,这道题就解出来啦
知识点:
上面这种题拓展一下,可以用来解决“找第n高的xxxx”这类题。
那么针对于这种题,我们可以尝试采取上述解题思路:递减排序并去重->找最大->找第n个->判空
- 如何找第n个呢?通过limit。
Limit参数的使用,分两种情况。第一种情况:limit使用一个参数,第二种情况:limit使用两个参数
1、limit使用一个参数的情况
如果"limit 10";则表示将表中的前10条数据查询出来,--检索前10行数据
2、limit使用两个参数的情况
第一个参数表示从第几行数据开始查,第二个参数表示查几条数据,"limit 0,2";表示从第1行数据开始,取2条数据。
区别:
一个参数时,参数值为多少就查询表中前多少条数据
两个参数时,因为limit默认下标从0开始,第一个参数是下标,查数据的话是从第一条查,第二个参数限定了几条数据
拓展:
Limit的下标默认从0开始,下标为0表示第一条记录,和数组一样,数组下标从0开始表示第一个元素
- 如何判空呢?
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。 IFNULL() 函数语法格式为: IFNULL(expression, alt_value) 如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值。 参数说明: | 参数 | 解析 ——————————————————————————————————————————————————————— | expression | 必须,要测试的值 | alt_value | 必须,expression表达式为NULL时返回的值 ———————————————————————————————————————————————————————