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
相关推荐
这个DBA有点耶18 分钟前
MySQL字符集与排序规则深入:索引失效的隐蔽场景与排查方法
数据库·mysql·代码规范
zl_dfq19 分钟前
Redis 之 【持久化 与 事务】
数据库·redis
闲云自留地1 小时前
从下载到登录:MySQL 在两大系统上的完整安装教程
数据库·mysql
SelectDB技术团队1 小时前
Apache Doris 高性能 Open Lake Variant 读写技术解析(含对比数据)
数据结构·数据库·clickhouse·日志·apache doris·selectdb·湖仓架构升级
一 乐2 小时前
博客管理系统|基于springboot + vue博客管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕设
茉莉玫瑰花茶2 小时前
GO [ 类型 ]
开发语言·数据库·golang
ClouGence2 小时前
开源数据库管理工具 CloudDM 4.3.0 发布,支持 SQL 收藏,多数据源语法支持大幅增强
数据库·oracle·sql server
Summer-Bright3 小时前
深度 | 壁仞1.74亿中标智算中心:国产GPU从能用跨进商用,但4.5亿的大单却因凑不齐三家废标了
数据库·ai·国产gpu
云安全助手3 小时前
自建接入VS聚合平台:企业 AI 调用的选型思路与迁移成本拆解
java·大数据·数据库·人工智能·ai大模型
白露与泡影3 小时前
Redis 的“单线程”与“多线程”:一场关于性能与简洁的权衡
数据库·redis·php