博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL IN, NOT IN, EXISTS, NOT EXISTS
阅读量:4960 次
发布时间:2019-06-12

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

IN与EXISTS执行流程

IN:在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。(IN时不对NULL进行处理)

EXISTS:在查询的时候,遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。使用EXISTS关键字进行查询的时候,首先查询的不是子查询的内容,而是查主查询的表,

 

如果两个表中一个较小,一个是大表,则子查询表大的用EXISTS,子查询表小的用IN:

例如:表A(小表),表B(大表)

1:
SELECT * FROM A WHERE a IN (SELECT b FROM  B) 
效率低,用到了A表上a列的索引;
SELECT * FROM A WHERE EXISTS (SELECT b FROM B WHERE b=A.a) 
效率高,用到了B表上b列的索引。
2:
SELECT * FROM B WHERE b IN (SELECT a FROM  A) 
效率高,用到了B表上b列的索引;
SELECT * FROM  B WHERE EXISTS (SELECT a FROM  A WHERE a=B.b) 
效率低,用到了A表上a列的索引。

 

IN与EXISTS应用场景

IN和EXISTS的区别:

如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用IN,

反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

IN是把外表和内表作hash连接,而EXISTS是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为EXISTS比IN效率高的说法是不准确的。

简易口诀:子查询相对小,用IN,否则用EXISTS.

 

NOT IN与NOT EXISTS

有了前面IN与EXISTS的分析,对NOT IN与NOT EXISTS就好理解了,

如果查询语句使用了NOT IN,那么内外表都进行全表扫描,没有用到索引;

而NOT EXISTS的子查询依然能用到表上的索引。

所以无论那个表大,用NOT EXISTS都比NOT IN要快。

简易口诀:否定用NOT EXISTS.

 

转载于:https://www.cnblogs.com/ken-jl/p/8892795.html

你可能感兴趣的文章
jQuery获取CSS样式中的颜色值的问题
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
Sqlite文件在ubunut的查看
查看>>
表单校验之datatype
查看>>
python第六篇文件处理类型
查看>>
kettle 数据库连接失败
查看>>
ListView失去焦点选中行不能高亮显示的问题解决
查看>>
# jsp及servlet学习笔记
查看>>
Kconfig详解
查看>>
(四)hadoop系列之__hadoop搭建(单机配置)
查看>>
nodejs爬虫数据存入mysql
查看>>
sphinx2.8.8的配置文件
查看>>
Visual Studio 2019 正式版 更新内容
查看>>
4、下行短信发送WebService、下行短信发送服务 -功能详细设计 --短信平台
查看>>
Failure to find com.oracle:ojdbc6:jar
查看>>
文本去重-----awk或者uniq
查看>>
Android学习笔记三:Intent实现页面跳转
查看>>
Django下JWT的使用
查看>>
React Native 的组件之底部导航栏 TabBarIOS(一)
查看>>
聊聊、SpringBoot 上传文件大小
查看>>