select null

本文探讨了MySQL中使用`select null`和处理空值的问题。在刷题过程中,作者遇到一道需要返回第二高收入数据的题目,原本打算用`ifnull`处理空值,但发现错误。通过学习,了解到正确做法是使用外层`select null`。文章还讨论了单独使用某些SQL语句看似返回null但实际上并未的情况,并给出正确解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文主要记录select null操作的相关笔记


1、select null

在MySQL中,使用select null会返回null。

2、select 1+1

3、刷题经验

在刷leetcode时,发现了一道题,说是返回收入第二高的数据,如果不存在返回空,题目链接点击此处,开始的想法是用ifnull,如果不存在返回null,但是一直通不过。
输入:

因为只有一行数据,在排序后肯定不存在排序为2的数据,感觉会返回null,然后使用ifnull来判断,判断为空后返回null,所以开始写的SQL语句为:

select ifnull(salary,NULL) SecondHighestSalary from(
select id,salary,row_number()over(order by salary)ra from Employee)e where ra=2

报错信息:

发现这样查询返回的一行数据都没有,没有按照设想返回null,最后正确的结果如下,要在外层再套一次select,使用select null的思路即可实现。

select (select distinct salary from(
select id,salary,dense_rank()over(order by salary desc)ra 
    from Employee)e where ra=2) SecondHighestSalary

其他参考答案

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

但是有一个值得注意的地方,为什么不能单独用下列语句?

SELECT DISTINCT
            Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET 1

在MySQL中单独使用上述语句的结果:

返回没有任何结果,但在navicat ide中单独使用上述语句的时候会返回下列结果:

这会让人以为已经返回了null,其实并没有,再加一层select后的结果如下:

此时的结果才是对的。

4、举一反三

在上面的问题基础上,自己想了一个SQL题,假设有一个工资表,需要获取工资相同的id中正序排序排名第二的id,如果没有的返回null,其中表内容如下:

SQL语句:

select distinct salary,n1.id from new_table n0 left join 
    (select id,salary sa from(select id,salary,
     row_number()over(partition by salary order by id)ra from new_table
                                         )n where ra=2)n1 on 
n0.salary=n1.sa

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sky-JT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值