MySQL:IFNULL无法返回null的情况

标签:Mysql, 数据库

为什么当exp为"空"时,IFNULL(exp,null)无法返回null。

前情提要
什么情景下会发生该问题

比如我们要找出一个表中只出现过一次的最大数字。如果没找到则返回NULL(Leetcode题目)。 又或者是找出某个不等于特定值的数,这个时候用IFNULL,很合理也很容易想到。

比如我们要找出不等于0的数,如果没找到就返回NULL。

复制代码
SELECT IFNULL(num,null) AS num
FROM MyNumbers
WHERE num!=0

However,这条SQL没用。你会发现返回的是空值,而不是null。这里为了方便直接复制leetcode的输出

复制代码
输入
MyNumbers =
| num | 
| --- | 
| 0 |

输出
| num |
| --- |

为啥呢?如果表中的所有数都等于0,那么按照SQL语句的执行顺序,FROM->WHERE->SELECT,在WHERE筛选后num不就为null了吗?为什么IFNULL无法返回后值null呢?

为啥在WHERE之后就不生效了?先思考一下,WHERE筛选之后的结果集是NULL吗?

如是。它真的是NULL吗?如是。WHERE筛选后确实没有匹配的记录,那它的结果集里面会有NULL吗?很明显不会,单纯就是啥都没有,即emptyset,空值的集合。

而IFNULL是干什么的?对于IFNULL(exp,value)来说,当exp的结果为NULL,才会返回value。而不是当exp的结果为空值(N/A)时,返回value。

要解决这个问题也很简单,加个聚合函数完事。最直接的就是加个MAX,MAX对emptyset计算,发现找不到任何一条记录,诶,那它就返回个NULL,完事。

复制代码
SELECT IFNULL(MAX(num),null)AS num
FROM MyNumbers
WHERE num!=0
相关推荐
bksczm7 分钟前
MySQL之读写分离与分库分表
数据库·mysql
姜鱼问生9 分钟前
报数据库连不上?Docker Compose 启动顺序假象:depends_on 不是万能的!
数据库·docker·容器
梅孔立16 分钟前
.mdb Access_MDB历史数据文件迁移MySQL实战教程-可直接投喂给ai参考这个帮你完成迁移
数据库·mysql·adb
时间售卖铺38 分钟前
MySQL 数据库账户及授权
运维·数据库·mysql·云原生
l1t39 分钟前
pgrust v0.4-beta 安装和查询测试
数据库·postgresql·rust·duckdb·pgrust
SelectDB技术团队39 分钟前
SelectDB 架构演进与 ClickHouse 迁移指南
大数据·数据库·clickhouse·云原生·架构·数据分析·apache doris
java_nnnn1 小时前
分布式系统进阶:数据库分库分表、微服务与架构演进总结
数据库·redis·微服务·架构
ZENERGY-众壹1 小时前
光伏监控平台实测,三款时序数据库在 50 万测点下的真实表现
数据库·架构·运维开发·时序数据库·光伏运维
2301_32241428048 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
catoop11 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全