exists、in的运用场景

exists、in的运用场景
 
            能不写子查询,尽量不写子查询,而是直接编写多表连接操作。理由如下:
            ① oracle CBO在parse阶段,会尽可能把子查询转化为多表连接
            ② 子查询可读性较低  www.2cto.com  
            ③ 复杂的逻辑,子查询可能导致oracle CBO选择错误的执行路径
            但如果必须写子查询,到底是in还是exists?exists/not exists专门用于关联子查询。10g之后,oracle对in的改进,这两者无甚区别。
 
            in和select的技术原理:
            ㈠ in:先进行子查询,再进行主查询
            ㈡ exists:先进行主查询,再到子查询中过滤
 
            in和exists的使用建议:
            Ⅰ 如果限制性强的条件在子查询,则使用in
            Ⅱ 如果限制性强的条件在主查询,则使用exists
            可用查询结果集来理解上面这段话,采用最优化匹配原则:拿最小记录匹配大记录。限制性强,则结果集小;反之,则大。
            注释:
            ① 使用exists可以将子查询结果定位常量,不影响查询结果,而且,效率高。
               比如:
[sql] 
select e.*  
  from emp e  
 where exists   
 (select 1 from dept d  
   where e.deptno=d.deptno and  
         d.dname='SALES')  
  www.2cto.com  
            ② not in可能会因为null而改变其行为导致和not exists结果集有出入。然而,在相关子查询下,not in和not exists的结果集是一样的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29446986/viewspace-2065212/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29446986/viewspace-2065212/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值