以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数据库这个测试结果也同样是这样的。