每日一练-SQL题176

题目:

 

分析:

首先看题目,我们需要解决这么几个问题:

  • 找到第二高(当然了有可能几条数据的薪水一样,所以注意去重)
  • 如果没有第二高,返回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时返回的值    
    ———————————————————————————————————————————————————————
     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值