1)用IN
select * from A
where id in(select id from B);

以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来。注意,是缓存了起来。之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录。

可以看出,当B表数据较大时不适合使用 in(),因为它会B表数据全部遍历一次。

如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次。
再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次。

2)用EXISTS

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

以上查询使用了exists语句,exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false。

如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次。

那,两种情况有什么不一样呢?不好意思,在没有where子句的时候,是一样的。因为根本没有筛选条件,何来先后的作用?

看下面一种解释:

in 操作的原理是先进行子查询操作,再进行主查询操作(适合主查询是大表,子查询是小表)。
exists 操作的原理是先进行主查询操作,再到子查询中进行过滤(适合主查询是小表,子查询是大表)。

但是,我更喜欢使用 in,因为更便于语句的改写,语义也更加明确。

oracle中exists 和 in 的区别的更多相关文章

  1. Oracle中exists与in的区别

    有两个简单例子,以说明 "exists"和"in"的效率问题 1) select * from T1 where exists(select 1 from T2 ...

  2. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

  3. oracle中rownum和rowid的区别

    rownum和rowid的区别总括: rownum和rowid都是伪列,但是两者的根本是不同的. rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownu ...

  4. oracle中rownum和rowid的区别【转】

    rownum和rowid的区别总括: rownum和rowid都是伪列,但是两者的根本是不同的. rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownu ...

  5. oracle中函数和存储过程的区别和联系

    oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...

  6. (转)ORACLE中SID和SERVICE_NAME的区别

    背景:之前一直分不清plsql和程序中配置文件url之间的连接,想当然的认为service_name 和jdburl后面的实例相对应,直到出错的这一天,通过这篇博客,彻底扫除了盲点. 1 问题 1.1 ...

  7. 转://Oracle中User和Schema的区别和联系

    今天在阅读Oracle官方文档的时候,读到schema的基本概念,这就让我产生了一个疑问:user和schema两者之间到底有什么区别?为了更深层次的理解二者之间的区别和联系,以下是官方文档中关于us ...

  8. Oracle中Restore和Recovery的区别

    一.参考解释一 在Oracle的备份与恢复的知识点中,经常会出现Restore 和 Recovery两个词. 由于这两个词在字典中的解释很接近,困扰了我很久.直到我在Oracle的官方文档中看到了以下 ...

  9. Oracle中用户和方案的区别

    从定义中我们可以看出方案(Schema)为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一 ...

随机推荐

  1. 基于Nginx的开墙方案

    Kubernetes集群内部通过服务名能进行相互调用,但如果Kubernetes中的pod需要调用外部服务,而且这些外部服务是属于不同的安全区域,就面临开墙的问题,因为Kubernetes Pod能够 ...

  2. B. Suffix Structures 模拟吧,情况比較多要想周全

    这道题须要考虑的情况比較多,flag1表示情况是:b数组里有的字母而a里没有和b里面的同一个字母个数比a里面的多 flag2表示情况:b里面的左右字母能不能在a中同等顺序的存在 flag3表示情况:a ...

  3. xampp Apache Access forbidden! Error 403解决方法

    今天下载了最新的xampp,配置了一个虚拟主机,一直在报错,Access forbidden! Error 403 这很明显是服务器不允许访问文件,但是我的虚拟主机配置如下: DocumentRoot ...

  4. Parallax Occlusion Mapping in GLSL [转]

    http://www.sunandblackcat.com/tipFullView.php?topicid=28   This lesson shows how to implement differ ...

  5. 【Linux】shell判断mysql端口是否启用?

    #!/bin/bash set -eux mysqld >& & CONNECTED=$(netstat -alnt | grep -c ":3306 ") ...

  6. js 修改css属性值

    js不能修改样式表 但是可以修改元素:比如 <div id="test" class="star-rating"></div> 对于上面 ...

  7. 这里先发布一个,自己写得unityUI的适配的方案(插播)

    这个适配是依据坐标系的象限的思想来进项适配的.參考了部分的NGUI的适配方案. 在程序的事实上,来測量UI距离相机边界的像素然后依据比例来进行适配,个人认为还不错. 放码! . 有个前提哦就是你要先定 ...

  8. 省市区县三级联动JAVA+MySQL+JQuery

    场景介绍: 由于项目要求,需要做一个进件(新增)功能,而该功能里要用到车品牌.车系.车型的联动查询,也就是经典的三级联动. 大体思路如下: 进入页面,会把所有的车品牌(第一级)在后台查询出来,放到缓存 ...

  9. Moving Tables-贪心

    id=19566" target="_blank" style="color:blue; text-decoration:none">Movin ...

  10. ios开发杂项(基础性介绍等)

    IOS Xcode开发中的文件后缀名区别m,mm,cpp,h .h :头文件.头文件包含类,类型,函数和常数的声明. .m :源代码文件.这是典型的源代码文件扩展名,可以包含Objective-C和C ...