博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL in和exists 比较
阅读量:4198 次
发布时间:2019-05-26

本文共 1083 字,大约阅读时间需要 3 分钟。

今天数据库的课上老师问了个问题说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适合于外表小而内表大的情况。

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

转载地址:http://avbli.baihongyu.com/

你可能感兴趣的文章
SQL语言的组成部分 ddl dcl dml
查看>>
mysql数据库从库同步延迟的问题
查看>>
1.mysql数据库主从复制部署笔记
查看>>
mysql数据库主从同步的问题解决方法
查看>>
mysql 配置 - on xFanxcy.com
查看>>
MySQL数据库高并发优化配置
查看>>
mysql一: 索引优化
查看>>
测试人员,今天再不懂BDD就晚了!
查看>>
35岁后还被职场青睐的人,都做了这几件事
查看>>
全链路压测那点事(一)
查看>>
阿里巴巴开源性能监控神器Arthas初体验
查看>>
使用猴子测试工具(7)
查看>>
使用猴子测试工具(8)
查看>>
一个简单的猴子测试小工具
查看>>
是QA还是AQ?
查看>>
害怕自动化(1)
查看>>
Script and Test Data
查看>>
在ITPub上发表文章《如何进行测试自动化的成本估算》
查看>>
深圳市软件质量提升工程系列活动——安全测试百人大课堂
查看>>
做培训讲师就像做一名导演
查看>>