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适合于外表小而内表大的情况。
我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是相对的
转载于:https://www.cnblogs.com/muyuge/archive/2010/03/28/6152604.html
SQL in和exists 比较相关推荐
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- Master-Detail(主表明细),确认可以出货的SQL指令 -- Not Exists
这是我文章的备份,原文请看: http://www.dotblogs.com.tw/mis2000lab/archive/2011/08/18/master_detail_finish_and_shi ...
- 【MySQL】sql语句中exists和in有何区别?
1.概述 sql语句中exists和in有何区别? SQL语句优化有哪些方法? sq|语句中exists和in有何区别如下: exists是用循环( loop )的方式,由outer表的记录数决定循环 ...
- SQL Server IF Exists 判断数据库对象是否存在的用法
1 判断数据库是否存在 Sql代码 if exists (select * from sys.databases where name = '数据库名') drop database [数据 ...
- mysql sql exists_数据库sql语句的exists总结
数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...
- 关于SQL中not exists的双重否定的一些记录
作者:kuikui 关于SQL中not exists的双重否定的一些记录 室友在学习数据库时遇到了not exists双重否定的一些问题 在csdn上学习大佬们的理解办法 借此机会回顾一下 eg.表结 ...
- 数据库sql语句的exists总结
数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...
- 你真的了解SQL中的EXISTS谓词吗?
EXISTS 谓词的用法 支撑 SQL 和关系数据库的基础理论主要有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是"一阶 ...
- SQL中关于EXISTS的嵌套子查询问题
SQL中关于EXISTS的嵌套子查询问题 SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解 ...
- SQL 中的exists关键字
今天同事问我一个SQL,使用的是exists子查询,因为对SQL不是很熟,所以就趁机查了下资料,了解一下SQL中的exists和not exists的用法. 注:本文基本上是转自别人的博客,下面附上所 ...
最新文章
- github上的图片当网络图片使用
- 小程序获取用户的操作轨迹日志
- 知乎热议!一个博士生接受怎样的训练是完整的科研训练?
- 人工操作阶段计算机是如何工作的,第一章计算机基础概述全解.ppt
- Laravel Scheduling Package
- VS中添加第三方库及相对路径设置
- Mathematica函数大全
- 23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)
- elementos php开发,PHPWord
- android模拟器 gpu,Android模拟器新版升级,新增GPU支持、多点触摸等功能【视频】...
- UE4如何贴混合贴图_八猴,Unity,UE4,还原SubstancePainter贴图
- LVDS,接口,时序讲解
- 乱码问题及字符编码集(一)
- graphpad两组t检验_GraphPad prism -- t检验操作步骤解析~
- JavaWeb在线刷题系统
- html 不间断背音乐代码,请参考不用框架结构做出 “页面间跳转而不间断的背景音乐”每次进去还是随机播放...
- java共享文件夹SMB1服务报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/122.168.23.26
- dellr服务器性能测试软件,戴尔Poweredge R740服务器使用感受 | 小迪的生产力工具室...
- 今天来聊聊函数function func()
- 5.基于Abp的DDD框架
热门文章
- DataList多行数据后如何添加一条分隔线
- SystemTimer,TimerTaskList等源码分析
- FPGA时钟激励编写(方法四)
- 纯英文换行的css,利用CSS实现纯英文数字自动换行
- html调用一个php文件路径_HTML中利用js调用php的内容
- 机械硬盘4k读写速度_三星T5移动硬盘应用评测:不止够用,还很好用
- python socket读取数据不能解析_通过实例解析return运行原理,除了quot;生孩子quot;python真是无所不能啊...
- EssentialC++
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用
- linux下ip协议(V4)的实现(三)