空值(null)对Oracle的影响

--注意,一定要运行看结果

SELECT * FROM DEPT;

SELECT DEPTNO FROM DEPT WHERE DEPTNO IN (10,50,NULL);
--可以看到使用IN的时候即便有NULL 也是正常的 下面看一下NOT IN

SELECT DEPTNO FROM DEPT WHERE DEPTNO NOT IN (10,50);
--这里看起来和我们的预期挺符合的哦

SELECT DEPTNO FROM DEPT WHERE DEPTNO NOT IN (10,50,NULL);
--怎么回事 为什么加了个NULL 前面的20、30、40三条数据就不显示出来了

/*
IN和NOT IN本质上都是OR运算,因而计算逻辑OR时处理NULL的方式不同,产生的结果也不同。

下面我们分析一下前面的三条语句*/

SELECT DEPTNO FROM DEPT WHERE DEPTNO IN (10,50,NULL);
--这里可以等价于WHERE DEPTNO=10 OR DEPTNO=50 OR DEPTNO=NULL,由于是OR相连接,那么只要有一个条件为TRUE,整个就喂TRUE了。所以DEPTNO为10的记录显示出来了。

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
*/

--以前只知道在WHERE条件返回FALSE的时候不成立,现在看来返回NULL的时候也不成立呀,下面是做的一个小实验可以证明这个猜想
SELECT * FROM DEPT WHERE 1=NULL;

SELECT DEPTNO FROM DEPT WHERE DEPTNO NOT IN (10,50);
/*这里等价于WHERE NOT (DEPTNO=10 OR DEPTNO=50),依然拿DEPTNO=20来举例。

NOT (20=10 OR 20=50 )

NOT(FALSE OR FALSE)

NOT FALSE

TRUE
*/

--注意:FALSE OR NULL=NULL ,而TRUE OR NULL=TRUE。

发布了35 篇原创文章 · 获赞 7 · 访问量 3353

猜你喜欢

转载自blog.csdn.net/Hjchidaozhe/article/details/100785602