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

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

转载于:https://www.cnblogs.com/muyuge/archive/2010/03/28/6152604.html

SQL in和exists 比较相关推荐

  1. 你真的会玩SQL吗?EXISTS和IN之间的区别

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  2. Master-Detail(主表明细),确认可以出货的SQL指令 -- Not Exists

    这是我文章的备份,原文请看: http://www.dotblogs.com.tw/mis2000lab/archive/2011/08/18/master_detail_finish_and_shi ...

  3. 【MySQL】sql语句中exists和in有何区别?

    1.概述 sql语句中exists和in有何区别? SQL语句优化有哪些方法? sq|语句中exists和in有何区别如下: exists是用循环( loop )的方式,由outer表的记录数决定循环 ...

  4. SQL Server IF Exists 判断数据库对象是否存在的用法

    1 判断数据库是否存在 Sql代码  if exists (select * from sys.databases where name = '数据库名')     drop database [数据 ...

  5. mysql sql exists_数据库sql语句的exists总结

    数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...

  6. 关于SQL中not exists的双重否定的一些记录

    作者:kuikui 关于SQL中not exists的双重否定的一些记录 室友在学习数据库时遇到了not exists双重否定的一些问题 在csdn上学习大佬们的理解办法 借此机会回顾一下 eg.表结 ...

  7. 数据库sql语句的exists总结

    数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...

  8. 你真的了解SQL中的EXISTS谓词吗?

    EXISTS 谓词的用法 支撑 SQL 和关系数据库的基础理论主要有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是"一阶 ...

  9. SQL中关于EXISTS的嵌套子查询问题

    SQL中关于EXISTS的嵌套子查询问题 SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解 ...

  10. SQL 中的exists关键字

    今天同事问我一个SQL,使用的是exists子查询,因为对SQL不是很熟,所以就趁机查了下资料,了解一下SQL中的exists和not exists的用法. 注:本文基本上是转自别人的博客,下面附上所 ...

最新文章

  1. github上的图片当网络图片使用
  2. 小程序获取用户的操作轨迹日志
  3. 知乎热议!一个博士生接受怎样的训练是完整的科研训练?
  4. 人工操作阶段计算机是如何工作的,第一章计算机基础概述全解.ppt
  5. Laravel Scheduling Package
  6. VS中添加第三方库及相对路径设置
  7. Mathematica函数大全
  8. 23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)
  9. elementos php开发,PHPWord
  10. android模拟器 gpu,Android模拟器新版升级,新增GPU支持、多点触摸等功能【视频】...
  11. UE4如何贴混合贴图_八猴,Unity,UE4,还原SubstancePainter贴图
  12. LVDS,接口,时序讲解
  13. 乱码问题及字符编码集(一)
  14. graphpad两组t检验_GraphPad prism -- t检验操作步骤解析~
  15. JavaWeb在线刷题系统
  16. html 不间断背音乐代码,请参考不用框架结构做出 “页面间跳转而不间断的背景音乐”每次进去还是随机播放...
  17. java共享文件夹SMB1服务报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/122.168.23.26
  18. dellr服务器性能测试软件,戴尔Poweredge R740服务器使用感受 | 小迪的生产力工具室...
  19. 今天来聊聊函数function func()
  20. 5.基于Abp的DDD框架

热门文章

  1. DataList多行数据后如何添加一条分隔线
  2. SystemTimer,TimerTaskList等源码分析
  3. FPGA时钟激励编写(方法四)
  4. 纯英文换行的css,利用CSS实现纯英文数字自动换行
  5. html调用一个php文件路径_HTML中利用js调用php的内容
  6. 机械硬盘4k读写速度_三星T5移动硬盘应用评测:不止够用,还很好用
  7. python socket读取数据不能解析_通过实例解析return运行原理,除了quot;生孩子quot;python真是无所不能啊...
  8. EssentialC++
  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用
  10. linux下ip协议(V4)的实现(三)