not in关键字使用的细节
前言
讲讲
not in
关键字使用上的小坑
我们知道,可以通过使用select * from table where filed in (xxx,xxx)
的方式来筛选出某个字段的值存在于给定集合范围内的记录,通过not in
关键字来判断某个字段的不存在给定集合范围内的数据。但是对于not in
关键字,上述的规则在碰上存在null值的集合范围内就不再生效了
在mysql
中,0
和NULL
都表示false,所以如果说,对于select * from table where field = NULL
这种sql,由于所有值和NULL
比较都会返回NULL
,所以是查不到任何数据的。对于NULL值的比较,需要用IS NULL
或者IS NOT NULL
来进行判断。
关于NULL
关键字,我们可以看一下官方的解释:https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html

官网说了,NULL
可以看做是未确认的值(注意,不是不存在的值),所有直接用=
,>
,<>
等规则和NULL比较的值,结果并不是我们猜想的true
或者false
,而是返回NULL
。
OK,说回NULL值对not in
的影响
对于not in
左右两侧存在NULL
,且左右两侧确实没有相同的值这种场景,比较的结果都会是NULL
。

对于not in
左右两侧存在NULL
,且左右两侧存在相同的值这种场景,比较的结果会是0
。

我们在上文有提过,无论是0
还是NULL
,对于mysql来说都会识别为false
,所以select * from table where field not in (NULL,a,b)
这种类型的sql,即使field的值为c,也是没有数据返回的。但是需要注意的是,对于in
关键字来说,是可以不受NULL
影响,正常查到数据的。
参考文章
MySQL IN和NOT IN用法详解:http://c.biancheng.net/view/7193.html
Working with NULL Values:https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)