前言
讲讲
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
网友评论