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
相关推荐
Nturmoils9 分钟前
查库存的 SQL 时灵时不灵,最后发现是 WHERE 里两个函数在打架
数据库
不想纳尼的青春1 小时前
where = 的作用?会影响性能吗?count(*) 和 count()哪个快?
数据库·oracle
倔强的石头_1 小时前
Spring Boot 接入金仓数据库:配置分层、启动自检与常见错误
数据库
黑桃小柒72 小时前
Django模型关系:从一对多到多对多全解析
数据库·django·sqlite
上海安当技术2 小时前
统一身份认证平台怎么落地?11 个异构业务系统接入 ASP 的完整实施路径
数据库·servlet·架构·kubernetes·jenkins
全栈派森2 小时前
告别大表膨胀!MySQL 冷热分离落地全过程(含 CDC 与单行锁抢占实战)
大数据·mysql
篮框坏了2 小时前
大事务 DELETE 锁表排查:删 3344 万行,一个清理任务变成周期炸弹
mysql
在水一缸3 小时前
PGSimCity:当数据库内核变成一座可以漫步的城市
数据库·postgresql·可视化·开源项目·数据库内核·pgsimcity·技术科普
jnrjian3 小时前
psql 执行多个 sql 文件
数据库·sql
LinuxGeek10243 小时前
Kylin-Server-V11、openEuler-22.03和openEuler-24.03适配原生rpm的MySQL 8.4.11版本正式发布
大数据·mysql·kylin