博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL中IN和EXISTS用法的区别
阅读量:6352 次
发布时间:2019-06-22

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

hot3.png

in和exists

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

NOT IN

SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC)

NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度

select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)

exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反。

exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。

如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');
select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

例子如下(即exists返回where后2个比较的where子句中相同值,not exists则返回where子句中不同值):

exists (sql 返回结果集为真)

not exists (sql 不返回结果集为真)

如下:

表A
ID NAME
1 A1
2 A2
3 A3

表B

ID AID NAME
1 1   B1
2 2   B2
3 2   B3

表A和表B是一对多的关系 A.ID --> B.AID

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.AID)

执行结果为
1 A1
2 A2
原因可以按照如下分析
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 1)
-->SELECT * FROM B WHERE B.AID = 1有值返回真所以有数据

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 2)

-->SELECT * FROM B WHERE B.AID = 2有值返回真所以有数据

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 3)

-->SELECT * FROM B WHERE B.AID = 3无值返回真所以没有数据

NOT EXISTS 就是反过来

SELECT ID , NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID = B.AID)
执行结果为
3 A3
 

转载于:https://my.oschina.net/u/1453975/blog/219714

你可能感兴趣的文章
linux命令执行过程
查看>>
TeeChart Pro VCL/FMX教程(七):使用函数(一)
查看>>
益配资:多年实战总结的配资技巧
查看>>
原创:软件架构那点事儿(四)
查看>>
nginx负载均衡
查看>>
求职秘技2:为什么公司不喜欢要应届毕业生
查看>>
什么公司什么情况下会招应届毕业生?(没有工作经验怎么找工作?/没有项目经验怎么办?)...
查看>>
希望能持之以恒的学习、学习、再学习
查看>>
linux下递归删除目录下的文件
查看>>
set ansi_nulls 和set quoted_identifier的使用总结
查看>>
将Hive的默认数据库Derby改为Postgresql
查看>>
redis做了缓存服务器就无法再做tomcat的session存储
查看>>
掌握Metro风格,开发靓丽应用
查看>>
Excel 竖列转横列实例
查看>>
Node.js Design Patterns--1.Node.js Design Fundamentals
查看>>
屏幕设配介绍
查看>>
P2V之后,给虚拟网卡设置IP时提示IP冲突的解决办法
查看>>
2月上旬中国域名解析服务商TOP10 万网稳居榜首
查看>>
1月上旬国内域名解析商Top10:DNSPOD升至16.5%
查看>>
10月上旬全球.ORG域名净增3061个 增速明显减慢
查看>>