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
浙公网安备 33010602011771号