SQL查询中in和exists的区别分析

龙少林 2019-12-22 00:00:00

推荐回答

本文主要分析了in和exists的区别与执行效率的问题:in可以分为三类:1、形如select*fromt1wheref1in''a'',''b'',应该和以下两种比较效率。select*fromt1wheref1=''a''orf1=''b''或者select*fromt1wheref1=''a''unionallselect*fromt1f1=''b''你可能指的不是这一类,这里不做讨论。2、形如select*fromt1wheref1inselectf1fromt2wheret2.fx=''x'',其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。3、形如select*fromt1wheref1inselectf1fromt2wheret2.fx=t1.fx,其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。除了第一类in语句都是可以转化成exists语句的,一般编程习惯应该是用exists而不用in.A,B两个表,1当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:select*fromAwhereidinselectidfromB2当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:select*fromAwhereexistsselect1fromBwhereid=A.idandcol1=A.col13当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:select*fromAleftjoinBonid=A.id所以使用何种方式,要根据要求来定。这是一般情况下做的测试:测试结果:setstatisticsioonselect*fromsysobjectswhereexistsselect1fromsyscolumnswhereid=syscolumns.idselect*fromsysobjectswhereidinselectidfromsyscolumnssetstatisticsiooff47行受影响表''syscolpars''。扫描计数1,逻辑读取3次,物理读取0次,预读2次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表''sysschobjs''。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。1行受影响44行受影响表''syscolpars''。扫描计数47,逻辑读取97次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表''sysschobjs''。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。1行受影响setstatisticsioonselect*fromsyscolumnswhereexistsselect1fromsysobjectswhereid=syscolumns.idselect*fromsyscolumnswhereidinselectidfromsysobjectssetstatisticsiooff419行受影响表''syscolpars''。扫描计数1,逻辑读取10次,物理读取0次,预读15次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表''sysschobjs''。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。1行受影响419行受影响表''syscolpars''。扫描计数1,逻辑读取10次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。表''sysschobjs''。扫描计数1,逻辑读取3次,物理读取0次,预读0次,lob逻辑读取0次,lob物理读取0次,lob预读0次。1行受影响测试结果总体来讲exists比in的效率高:效率:条件因素的索引是非常关键的把syscolumns作为条件:syscolumns数据大于sysobjects用in扫描计数47,逻辑读取97次,用exists扫描计数1,逻辑读取3次把sysobjects作为条件:sysobjects的数据少于syscolumnsexists比in多预读15次。
龙小语2019-12-22 00:37:01

提示您:回答为网友贡献,仅供参考。

其他回答

  • 我给你举几个例子你感受一下。1select * from student where class not in ''1'',''2'',''3''查询班级不在1,2,3的学生信息2select * from student where class in ''1'',''2'',''3''查询班级在1,2,3的学生信息in和not in的用法,更多会出现在子查询中,例如 select * from student where sno in select sno from Exam where course =''English''  查询参加了英语考试的学生信息。3exists 更多时候出现在if判断中, 它只做一个是或否的判断,例如如果存在birthday=今天的学生,那么就把他的age+1if exists select 1 from student where birthday=getdateBEGINupdate student set age=age+1 where birthday=getdateENDelse select N''今天没有同学过生日。
    辛在柱2019-12-22 01:54:06
  • in和existsin是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A1:select*fromAwhereccinselectccfromB效率低,用到了A表上cc列的索引;select*fromAwhereexistsselectccfromBwherecc=A.cc效率高,用到了B表上cc列的索引。相反的2:select*fromBwhereccinselectccfromA效率高,用到了B表上cc列的索引;select*fromBwhereexistsselectccfromAwherecc=B.cc效率低,用到了A表上cc列的索引。notin和notexists如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。所以无论那个表大,用notexists都比notin要快。in与=的区别selectnamefromstudentwherenamein''zhang'',''wang'',''li'',''zhao'';与selectnamefromstudentwherename=''zhang''orname=''li''orname=''wang''orname=''zhao''的结果是相同的。转的http://zhidao.baidu.com/link?url=JYAd0XwcGuw_iczn2GEo-0dlXPx8VAJ5yioHevPcHMn47Gl-lx0XqDieefQWuvRgOMsiWOFcRZTqqjQ3RYcYpa。
    黄田青2019-12-22 00:55:01
  • in是把外表和内表作hash连接,而exists是对外表作loop循环。确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。具体sql语句如下:1SELECT2  *3FROM4  `user`5WHERE6  `user`.idIN7    SELECT8      `order`.user_id9    FROM10      `order`exist是指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。具体sql语句如下:1SELECT2  `user`.*3FROM4  `user`5WHERE6  EXISTS7    SELECT8      `order`.user_id9    FROM10      `order`11    WHERE12      `user`.id=`order`.user_id。
    黄看看2019-12-22 00:19:20
  • 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。in和exists的区别如下:1、运用情况不同sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,。sql中exist适用于外层的主查询记录较少,子查询中的表大,又有索引的时候。2、驱动顺序不同IN是先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。exists是以外层表为驱动表,先被访问。3、对NULL值处理不同。IN不对NULL进行处理,exists会对NULL值进行处理。4、底层原理不同in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。SQL数据库。
    齐晓斌2019-12-22 00:07:03

相关问答