ITPub博客

首页 > Linux操作系统 > Linux操作系统 > in exists的区别和SQL执行效率

in exists的区别和SQL执行效率

原创 Linux操作系统 作者:pyzwj 时间:2012-12-11 15:53:29 0 删除 编辑
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

  所以使用何种方式,要根据要求来定。

在某个论坛上看到的,记下来总结一下。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28194062/viewspace-750910/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-09-25

  • 博文量
    63
  • 访问量
    303308