1. IN
执行SQL: select deptno from dept where deptno in (10,50,null);
结果: 10
看到使用in的时候即便有null 也是正常的 下面看一下not in
2. NOT IN
执行SQL: select deptno from dept where deptno not in (10,50);
结果: 20
30
40
这里看起来和我们的预期挺符合的哦
3. NOT IN 加NULL
执行SQL: select deptno from dept where deptno not in (10,50,null);
结果: no rows selected
怎么回事 为什么加了个null 前面的20、30、40三条数据就不显示出来了
IN和NOT IN本质上都是OR运算,因而计算逻辑OR时处理NULL的方式不同,产生的结果也不同。
下面我们分析一下前面的三条语句
SQL: select deptno from dept where deptno in (10,50,null);
这里可以等价于where deptno=10 or deptno=50 or deptno=null,由于是or相连接,那么只要有一个条件为TRUE,整个就喂TRUE了。所以deptno为10的记录显示出来了。
SQL: select deptno from dept where deptno not in (10,50,null);
这里等价于where not (deptno=10 or deptno=50 or deptno=null),拿deptno=20的记录来举例吧。
not (20=10 or 20=50 or 20=null)
not(false or false or null)
not null
null
举例:a not in (10,20,null);
a!=10 and a!=20 and a!= null 返回null
(以前只知道在 where条件返回false的时候不成立,现在看来返回NULL的时候也不成立呀,下面是做的一个小实验可以证明这个猜想)
执行SQL: select * from dept where 1=null;
结果: no rows selected
执行SQL: select deptno from dept where deptno not in (10,50);
结果: no rows selected
这里等价于where not (deptno=10 or deptno=50),依然拿deptno=20来举例。
not (20=10 or 20=50 )
not(false or false)
not false
true
本文通过实例解析了SQL中IN与NOT IN操作符的使用方式,特别是当NULL值出现时的区别,并探讨了其背后的逻辑原理。
1114

被折叠的 条评论
为什么被折叠?



