数据库 not in 的坑

以oracle数据库为列:

CREATE TABLE test_20191124(NAME VARCHAR2(5),num_cnt NUMBER);
INSERT INTO test_20191124 VALUES('a',1);
INSERT INTO test_20191124 VALUES('b',2);
INSERT INTO test_20191124 VALUES('c',3);
CREATE TABLE test_20191124_1(NAME VARCHAR2(5),num_cnt NUMBER);
INSERT INTO test_20191124_1 VALUES('a',1);
INSERT INTO test_20191124_1 VALUES('b',2);
INSERT INTO test_20191124_1 VALUES(NULL,3);

进行not in查询

SELECT * FROM test_20191124 WHERE NAME NOT IN (SELECT NAME FROM test_20191124_1);

是不是觉得应该返回
“‘c’,3”
其实实际结果是:
在这里插入图片描述

这是为什么呢,因为数据库在反连接时候,使用not in 如果子查询中返回有null值的时候,那么整个结果都返回为空。现在对上边sql进行改写为

SELECT *
  FROM TEST_20191124
 WHERE NAME NOT IN
       (SELECT NAME FROM TEST_20191124_1 WHERE NAME IS NOT NULL);

在这里插入图片描述
为了避免这种情况出现,可以使用not exists

SELECT *
  FROM TEST_20191124 a 
  WHERE NOT EXISTS (SELECT 1 FROM test_20191124_1 b WHERE a.name=b.name);

结果为
在这里插入图片描述
现在在进行测试 in的用法

SELECT * FROM test_20191124 WHERE NAME  IN (SELECT NAME FROM test_20191124_1);

在这里插入图片描述
所以看出来,在子查询 in 的时候不会受返回值为null的影响,但是not in 的时候一定要注意。如果不想记住这个可以直接用 not exists。
在td数据库这个测试结果也同样是这样的。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值