• 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,当然实际情况比理论上有复杂的多,不过两者还是有差异的
  • 相关阅读:
    Hadoop专有名词
    mapreduce的cleanUp和setUp的特殊用法(TopN问题)和常规用法
    Hadoop 中文编码相关问题 -- mapreduce程序处理GBK编码数据并输出GBK编码数据
    MapReduce核心
    技术提升
    Linq使用group by
    C#中DllImport用法
    mysql分组后将未分组的列合并成行GROUP BY,GROUP_CONCAT
    MVC之CodeFirst
    MVC的Forms登录验证
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400551.html
Copyright © 2020-2023  润新知