not in与not exists的区别

在数据库的开发过程中很多时候是需要对数据进行过滤,使用比较多的会是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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值