一、 结论

  1. in()适合子表比主表数据小的情况

  2. exists()适合子表比主表数据大的情况

  3. 当主表数据与子表数据一样大时,in与exists效率差不多,可任选一个使用

二、区别

2.1 in的性能分析

select * from A
where id in(select id from B)

我们知道上诉sql会先执行括号内的子查询,再执行主查询,因此相当于以下过程:

for select id from B
for select * from A where A.id = B.id

分析:
0、当前的in子查询是B表驱动A表
1、mysql先将B表的数据一把查出来至于内存中
2、遍历B表的数据,再去查A表(每次遍历都是一次连接交互,这里会耗资源)
3、假设B有100000条记录,A有10条记录,会交互100000次数据库;再假设B有10条记录,A有100000记录,只会发生10次交互。

结论:in()适合B表比A表数据小的情况

2.2 Exists的性能分析

select a.* from A a
where exists(select 1 from B b where a.id=b.id)

类似于以下过程

for  select * from A
for  select 1 from B where B.id = A.id 

分析:
0、当前exists查询是A表驱动B表
1、与in不同,exists将A的纪录数查询到内存,因此A表的记录数决定了数据库的交互次数
2、假设A有10000条记录,B有10条记录,数据库交互次数为10000;假设A有10条,B有10000条,数据库交互次数为10。

2.3 小结

我们来看下面两个循环:
for (int i = 0; i<10000; i++){
for(int j = 0; j<10; j++){
····

for (int i = 0; i<10; i++){
for(int j = 0; j<10000; j++){
····
在java中,我们都知道上述的两个循环的时间复杂度都是一样的;但在数据库中则是有区别的,首先第一层循环,数据库只做一次交互一把将数据查出到缓存中,而第二层循环的数据库交互次数决定于第一层循环数据量的大小。对于数据库而言,交互次数越多越耗费资源,一次交互涉及了“连接-查找-断开”这些操作,是相当耗费资源的。
使用in时,B表驱动A
使用exists时,A表驱动B
所以我们写sql时应当遵循“小表驱动大表“的原则

三、sql使用示例

3.1 in的使用

select a_Id,a1,a2,a3 from A where id in (?,?);
select a_Id,a1,a2,a3 from A where id in (select b_id from B where b1 = ?);

3.2 Exsits的使用

select a_id,a1,a2,a3 from A where Exists (select 1 from B where b1 = ? and b_id = a_id);

四、工作中应用场景

表A(id1,id2,id3,a1,a2,a3···),主键(id1,id2,id3)
表B(id3,b1,b2,b3···),主键(id3)
业务:根据给出的id1条件,去查询仅被id1引用的表B记录.
Exists:

select * from B bwhere exists ( select 1 from A  where id3 = b.id3 and id1 = ?)and not exists (select 1 from A where id3 != b.id3  and id1 = ?)

In:

select * from B where id3 in ( select id3 from A  where id1 = ?)and not in (select id3 from A where i id1 = ?)

五、小谈

1、in的限制

在oracle中使用IN,其括号内列表允许最大的表达式数为1000,超出1000会报错。
如下sql:

select * from A where id in ('1','1','1','1','1',····,'1','1');

当括号内的值超出1000会报错,但在mysql上执行却是可以的。
处于好奇,本人又做了如下sql测试:

select * from A where id in (select id from A);

这条sql执行是成功的,即便括号内的语句查出的值超出1000,在oracle和mysql都是能执行成功的。

因此,oracle报的表达式列表不能超过1000,并非是容量不能超过1000.

2、count(*)、count(id)、count(1)选择

使用select 1 from table的结果是临时得到1列(列的值为1),其行数为表的记录数(行数),如果配合exists 语句则可以快速查询结果是否存在,而结果的具体数据不涉及到,在应用中,效率比select * 快。
扩展: select 1 from table;与select anycol(目的表集合中的任意一行) from table;与select * from table 从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。select 1 from 中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
也由此,我们可以知道,平常时我们统计行数时,使用count(常量),效率更高,如下:

select count(id) from table;
select count(*) from table;
select count(1) from table;
count(1)的效率最高,因为它不关注具体的数据。

(这里我也是参考网上说的,有的人说*比1好,又有人说1比*好,又有人说两者相差不大,大家都言之有理,至于谁说的对,就留给大家自己去思考了,我博文这里就故意不改了,至于错与对由大家选择哈哈哈,本人写的东西也不一定对顶多用于参考,对这个有疑问的也可以参考阿里规范:
https://developer.aliyun.com/article/756450)

IN和EXISTS的区别和使用相关推荐

  1. Sql语句中IN和exists的区别及应用

    表展示 首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 确定给定的值是否与子查询或列表中的值相匹配.in在查询的时候,首先查询子查询 ...

  2. in和exists的区别和使用场景纪要

    背景:闲来有空整理一下,特此纪要! 问题:SQL查询中in和exists的区别和使用场景是什么?1. in的使用场景是什么?:日常查询中会有多值包含的情况处理,此时就需要in来解决.(Eg:in('a ...

  3. in和exists的区别

    in和exists的区别 表展示 首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 确定给定的值是否与子查询或列表中的值相匹配.in在 ...

  4. MySQL中In与Exists的区别

    MySQL中In与Exists的区别 1 例子 2 EXISTS和IN的介绍 2.1 exists 2.2 in 2.3 使用上的区别 3 EXISTS和IN的性能分析 4 总结 1 例子 有两个表需 ...

  5. 举例说明SQL中 in和exists的区别

    in和exists的区别 新建两个表 user表 account表 in SELECT * FROM user u where u.id in (select user_id from account ...

  6. SQL中的in与not in、exists与not exists的区别以及性能分析

    1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个 ...

  7. 浅谈sql中的in与not in,exists与not exists的区别以及性能分析

    1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...

  8. 浅谈sql中的in与not in,exists与not exists的区别

    1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...

  9. sql中in和exists、not in 和 not exists的区别

    总结 in语句只执行一次,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选.适合子表比主表数据小的情况 exists对外表作loop循环,每次loop循环再对内表进行查询.ex ...

  10. oracle中in与exists,Oracle中in和exists的区别

    项目中对数据库的查询操作很多,各种拼接,各种in,但由于in的内容受字符限制,所以有些地方将in改成了Extist,两种写法有什么关联,查了写资料,分析看看: in和exists in 是把外表和内表 ...

最新文章

  1. 打印文件测试的测试点
  2. 实验四 查找和排序算法实现
  3. vivox60pro和iqoo7pro哪个好
  4. (41)System Verilog 例化System Verilog模块
  5. 75-100-020-测试-MySQL 单表优化案例
  6. pip安装pytorch(CPU)附上whl文件
  7. plsql developer无法识别32位oracle问题如何解决?
  8. Dbgview调试工具的使用
  9. ZXing条码扫描----竖屏解决方案
  10. 中国环氧树脂行业运营模式与营销创新策略分析报告2021-2027年版
  11. Capte4 布朗运动和伊藤公式
  12. 都说数据是资产,那么到底什么是数据资产?
  13. SmartUplod中文乱码问题(已解决)
  14. 编译器工具链初步解析
  15. 【Unity基础知识之一】 Unity支持 IOS 64-BIT
  16. 曼哈顿算法公式_距离计算方法总结
  17. 豆瓣民谣排行100爬取练习
  18. 6S大气校正模型源码
  19. 51 地图基本接口(三)
  20. 不要再重复造轮子了,Hutool这款开源工具类库贼好使

热门文章

  1. Centos7进入图形界面
  2. IPO\IPOH快速开关机相关
  3. js实现页面上滑或者下滑,按钮一直处于最底部
  4. LG GP750 显示器评测
  5. 《数学建模简明教程--基于python》学习笔记-第二章-绘图与解方程组-课后习题解答
  6. 蠕虫病毒Worm: VBS/Jenxcus!lnk 解决方案 Python脚本
  7. 仿腾讯手机管家快捷中心功能的实现方案
  8. 2020系统规划与管理师考试通过率探秘
  9. 微软一个数据中心有多少服务器,微软晒Windows数据中心级机器 一共拥有多达896个物理核心和1792个逻辑核心...
  10. #边学边记 必修4 高项:对事的管理 第5章 项目成本管理 之 制订成本管理计划