zoukankan      html  css  js  c++  java
  • oracle中in,not in和exists,not exists之间的区别


    存在测试IN、NOT IN、EXISTS、NOT EXISTS

    例:SELECT * FROM SC WHERE SNO IN

    (SELECT SNO FROM STUDENT WHERE SSEX=’女’);

    同:SELECT * FROM SC WHERE EXISTS

    (SELECT * FROM STUDENT WHERE SSEX=’女’ AND SC.SNO=SNO);

    返回所有女生的成绩

    例:SELECT * FROM SC WHERE SNO NOT IN

                          (SELECT SNO FROM STUDENT WHERE SSEX=’女’);

    同:SELECT * FROM SC WHERE NOT EXISTS

                          (SELECT * FROM STUDENT WHERE SSEX=’女’ AND SC.SNO=SNO);

    返回性别不为女的记录

    说明:使用EXISTS相比IN,当使用IN检索到数据非常少时,IN比EXISTS快,反之,使用EXISTS比IN快。

    如果EXISTS后面的SELECT * 改为SELECT ‘常量’(例如,a, b, c等),速度会更快。

    谓词中含有“全部、至少、没有”时,使用NOT EXISTS.


    oracle中in,not in和exists,not exists之间的区别 一直听到的都是说尽量用exists不要用in,因为exists只判断存在而in需要对比值,所以exists比较快,但看了看网上的一些东西才发现根本不是这么回事。
    下面这段是抄的
    Select * from T1 where x in ( select y from T2 )
    执行的过程相当于:
    select *
    from t1, ( select distinct y from t2 ) t2
    where t1.x = t2.y;

    select * from t1 where exists ( select null from t2 where y = x )
    执行的过程相当于:
    for x in ( select * from t1 )
       loop
          if ( exists ( select null from t2 where y = x.x )
          then
             OUTPUT THE RECORD
          end if
    end loop

    从我的角度来说,in的方式比较直观,exists则有些绕,而且in可以用于各种子查询,而exists好像只用于关联子查询(其他子查询当然也可以用,可惜没意义)。
    由于exists是用loop的方式,所以,循环的次数对于exists影响最大,所以,外表要记录数少,内表就无所谓了,而in用的是hash join,所以内表如果小,整个查询的范围都会很小,如果内表很大,外表如果也很大就很慢了,这时候exists才真正的会快过in的方式。
             下面这段还是抄的not in 和not exists
    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
    而not extsts 的子查询依然能用到表上的索引。
    所以无论那个表大,用not exists都比not in要快。

              也就是说,in和exists需要具体情况具体分析,not in和not exists就不用分析了,尽量用not exists就好了。

    典型的连接类型共有3种:
    排序 - - 合并连接(Sort Merge Join (SMJ) )
    嵌套循环(Nested Loops (NL) )
    哈希连接(Hash Join)

    嵌套循环和哈希连接的算法还是有不同,在理论上哈希连接要快过排序和nl,当然实际情况比理论上有复杂的多,不过两者还是有差异的
  • 相关阅读:
    Selenium简单测试页面加载速度的性能(Page loading performance)
    Selenium Page object Pattern usage
    Selenium如何支持测试Windows application
    UI Automation的两个成熟的框架(QTP 和Selenium)
    分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
    敏捷开发中的测试金字塔(转)
    Selenium 的基础框架类
    selenium2 run in Jenkins GUI testing not visible or browser not open but run in background浏览器后台运行不可见
    eclipse与SVN 结合(删除SVN中已经上传的问题)
    配置Jenkins的slave节点的详细步骤适合windows等其他平台
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400551.html
Copyright © 2011-2022 走看看