• SQL in和exists 比较


    今天数据库的课上老师问了个问题说in和exists哪个效率高。这我倒真没研究过只知道in加子查询效率低,但平时还不时在用。所以我就总结下他们之间的区别

    SQL中in可以分为三类:

      1、形如select * from t1 where f1 in ('a','b'),应该和以下两种比较效率
      select * from t1 where f1='a' or f1='b'
      或者 select * from t1 where f1 ='a' union all select * from t1 f1='b'
      你可能指的不是这一类,这里不做讨论。
      2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),
      其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
      3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
      其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。
      除了第一类in语句都是可以转化成exists 语句的SQL,一般编程习惯应该是用exists而不用in,而很少去考虑in和exists的执行效率.

    in和exists的SQL的使用和比较

      A,B两个表,
      (1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:
      select * from A where id in (select id from B)
      (2)当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:
      select * from A
      where exists (select 1 from B where id = A.id and col1 = A.col1)
      (3)当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:
      select * from A left join B on id = A.id
      所以使用何种方式,要根据要求来定

    IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

    我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是相对的

  • 相关阅读:
    牛客小白月赛21
    牛客小白月赛21
    CodeForces 1333-C Eugene and an array(子区间和为0、前缀和)
    页面大小、页表项、虚拟地址和物理地址之间的关系(转)
    001-Paint_FreePythonGames项目代码详解(每行都有注释!!!)
    第17讲~第19讲:函数:python的乐高积木
    第16讲:序列!序列!
    第15讲:字符串格式化
    练习23--字符串、字节和编码
    第14讲:字符串--各种奇葩内置方法
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152604.html
Copyright © 2020-2023  润新知