在数据库的开发过程中很多时候是需要对数据进行过滤,使用比较多的会是not in 与not exists,但是在很多时候使用not in 会出现致命的BUG。
以下对not in 与not exists进行对比:
1、效率方面:如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快;
2、BUG方面:可以参考一下的例子进行测试
create table t1 (c1 number,c2 number);
create table t2 (c1 number,c2 number);
insert into t1 values (1,2);
insert into t1 values (1,3);
insert into t2 values (1,2);
insert into t2 values (1,null);
select * from t1 where c2 not in (select c2 from t2);
no rows found
select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2);
c1 c2
1 3
为什么会出现这个问题???这个问题在项目中出现过,困惑了很久
解释:使用not in调用的是子查询,而使用not exists调用的是关联子查询。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录,正如上面例子所示。
除非子查询字段有非空限制,这时可以使用not in ,并且也可以通过提示让它使用hasg_aj或merge_aj连接。
建议:在开发的过程中尽量使用not exists;