oracle 子查询中null的问题(in 和 not in)

这里的in后面的句子能够理解为or拼接,简单举例即函数

in (9566,9839,null)能够等价于mgr=9566 or mgr=9839 or mgr=null,索引

not in (9566,9839,null)能够等价于not(mgr=9566 or mgr=9839 or mgr=null)或mgr!=9566 and mgr!=9839 and mgr!=null。hash

为何都是or拼接,in能够而not in不能够呢,能够把not in理解为后面的and表达式就知道了,由于mgr=null为null,也就至关于false,致使整个表达式为false,不管传何值都为false,天然没法返回数据。select

当发现not in后的子查询后面有null值时,能够在子查询里用is not null或函数过滤null值。数据

 

正如所看到的,not in出现了不指望的结果集,存在逻辑错误。若是看一下上述两个select 语句的执行计划,也会不一样,后者使用了hash_aj,因此,请尽可能不要使用not in(它会调用子查询),而尽可能使用not exists(它会调用关联子查询)。若是子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。若是子查询字段有非空限制,这时可使用not in,而且能够经过提示让它用hasg_aj或merge_aj链接。查询

若是查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。因此不管哪一个表大,用not exists都比not in 要快。

错误

相关文章
相关标签/搜索