百科狗-知识改变命运!
--

SQL查询中in和exists有什么区别?

是丫丫呀11个月前 (12-02)阅读数 15#综合百科
文章标签索引表上

1.exist,notexist一般都是与子查询一起使用.In可以与子查询一起使用,也可以直接in(a,b.....)\x0d\\x0d\2.exist会针对子查询的表使用索引.notexist会对主子查询都会使用索引.in与子查询一起使用的时候,只能针对主查询使用索引.notin则不会使用任何索引.注意,一直以来认为exists比in效率高的说法是不准确的。\x0d\in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。\x0d\如果查询的两个表大小相当,那么用in和exists差别不大。\x0d\如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:\x0d\例如:表A(小表),表B(大表)1:select*fromAwhereccin(selectccfromB)\x0d\效率低,用到了A表上cc列的索引;select*fromAwhereexists(selectccfromBwherecc=A.cc)\x0d\效率高,用到了B表上cc列的索引。\x0d\相反的2:select*fromBwhereccin(selectccfromA)\x0d\效率高,用到了B表上cc列的索引;select*fromBwhereexists(selectccfromAwherecc=B.cc)\x0d\效率低,用到了A表上cc列的索引。\x0d\notin和notexists如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。所以无论那个表大,用notexists都比notin要快。\x0d\3.exist与in都可以实现一个目的.二者都可以用来过滤数据.\x0d\示例:\x0d\\x0d\selectcount(1)fromt1;--160W\x0d\selectcount(1)fromt2;--90W\x0d\\x0d\SELECTcount(1)\x0d\FROMt1a\x0d\WHEREEXISTS(SELECTaccountid\x0d\FROMt2b\x0d\WHEREa.keyid=b.keyidANDa.ideaid=b.ideaid);--主大子小,不适合使用exist,因为exist只会利用子表t2的复合索引keyid+ideaid,而子表内容要小与主表,主表由于无法使用索引,查询效率低下.\x0d\\x0d\selectcount(1)fromt1awhereaccountidin(SELECTaccountid\x0d\FROMt2b\x0d\WHEREa.keyid=b.keyidANDa.ideaid=b.ideaid);--主大子小,适合用in,因为in只会使用主表t1里面的复合主键keyid-ideaid,在主表大于子表的情况下,会很好的利用主表的索引.\x0d\\x0d\--后二条sql的执行结果都是一样的.说明exist与in在用法上可以达到一个目的,不同的地方是\x0d\--1.性能的考虑此时就按子表大主表小用exist,子表小主表大用in的原则就可以.\x0d\--2.写法的不同,exist的where条件是:"......whereexist(.....wherea.id=b.id)"\x0d\--in的where条件是:"......whereidin(selectid....wherea.id=b.id)"\x0d\\x0d\4.exist的原理:\x0d\exists做为where条件时,是先对where前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出\x0d\比如\x0d\如下:\x0d\表A\x0d\IDNAME\x0d\1A1\x0d\2A2\x0d\3A3\x0d\\x0d\表B\x0d\IDAIDNAME\x0d\11B1\x0d\22B2\x0d\32B3\x0d\\x0d\表A和表B是一对多的关系A.ID-->B.AID\x0d\\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECT*FROMBWHEREA.ID=B.AID)\x0d\执行结果为\x0d\1A1\x0d\2A2\x0d\原因可以按照如下分析\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECT*FROMBWHEREB.AID=1)\x0d\-->SELECT*FROMBWHEREB.AID=1有值返回真所以有数据\x0d\\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECT*FROMBWHEREB.AID=2)\x0d\-->SELECT*FROMBWHEREB.AID=2有值返回真所以有数据\x0d\\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECT*FROMBWHEREB.AID=3)\x0d\-->SELECT*FROMBWHEREB.AID=3无值返回真所以没有数据\x0d\\x0d\NOTEXISTS就是反过来\x0d\SELECTID,NAMEFROMAWHERENOTEXIST(SELECT*FROMBWHEREA.ID=B.AID)\x0d\执行结果为\x0d\3A3\x0d\5.in与=的区别\x0d\selectnamefromstudentwherenamein('zhang','wang','li','zhao');\x0d\与\x0d\selectnamefromstudentwherename='zhang'orname='li'orname='wang'orname='zhao'\x0d\的结果是相同的。\x0d\in的字段也可以与其它字段建复合索引.\x0d\比如\x0d\T1包含下面key,accountd,groupid.\x0d\\x0d\SELECT*\x0d\FROMT1a\x0d\WHEREa.groupid=2001\x0d\ANDa.accountid=1001\x0d\ANDa.keyIN('abc','def','ala');\x0d\\x0d\--上面的sql可以将accountid,key建成复合索引.

ae带cc和不带cc有区别如下

SQL查询中in和exists有什么区别?

1、两者发行时间不同:CS是CC之前的一个系列,AE的发展为最开始的X.0或X.5版本;CC属于7.0版本。

2、官方语言不同:CC是中文版,CS6是英文版。后者使用模板更方便些,因为AE最开始就是全英文版的,很多国外的模板可以直接用。

3、包含的应用不同:CC家族包括:PhotoshopCC、InDesignCC、IllustratorCC、DreamweaverCC、PremiereProCC;CS除了前面几项,还新增了AdobePreludeCS6、AdobeSpeedGrade等项目。

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)