无论是做项目还是普通使用SQL,我们通常都会使用IN。因为很好理解,也很方便。但是,面对着多层查询嵌套,或者IN关键字里面的结果集数量巨大,查询的效率就会直线下降。这时候,我们应该用好EXSITS。

首先,来一个简单的例子。

with score(id,name,subject,score)
as(
select 0,'张三','数学',88 from dual union all
select 1,'张三','英语',78 from dual union all
select 2,'李四','数学',68 from dual union all
select 3,'李四','英语',98 from dual union all
select 4,'王五','数学',77 from dual union all
select 5,'王五','英语',92 from dual union all
select 6,'赵六','数学',81 from dual union all
select 7,'赵六','英语',75 from dual
)
,has_phone(name,has_phone)
as(
select '张三','有' from dual union all
select '李四','没有' from dual union all
select '王五','没有' from dual union all
select '赵六','有' from dual
)
--select *
--  from score a
-- where name in (select name from has_phone where has_phone = '有')
select *from score awhere exists (select 1from has_phone bwhere b.name = a.nameand has_phone = '有')

  这段SQL的意思是,查询有手机的同学的成绩。

那么我来理解一下IN和EXSITS的区别吧。 
在使用IN的时候。 
数据库首先是去在has_phone里面查找所有条件为“有”的name。 
然后把这些结果集让每一个name去匹配。

在使用EXSITS的时候。 
数据库是先查询SCORE,然后每个连接条件到EXSITS里面进行判断。 
如果为TRUE,则加入结果集,否则就跳过。

EXSITS执行过程 
可以理解为: 
for x in (select * from score a) 
loop

if(exists(select 1 from has_phone b where b.name = a.name )) 
then 
  output the record; 
end if;

end loop;

对于in 和 exists的性能区别: 
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in; 
反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists. 
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists, 
那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标, 
那么就会考虑到索引及结果集的关系了

原文:http://dacoolbaby.iteye.com/blog/1638990

转载于:https://www.cnblogs.com/skyapplezhao/p/3796318.html

EXSITS应该怎么用?相关推荐

  1. sql中的exsits和not exsits

    select * from table where exsits(sql语句) :  括号中sql语句有数据则返回这些相关id的数据集 select * from table where not ex ...

  2. oracle update exsits,Oracle 11g 递归+ exists执行计划的改变

    有一个递归查询在Oracle 10g上运行很快,但在11g上运行不出来. SQL> select * from v$version; BANNER ----------------------- ...

  3. exsits函数_SQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  4. python urlretrieve登录下载_使用python urlretrieve下载文件

    urlretrieve()方法直接将远程数据下载到本地.urlretrieve()是python urllib下的一个函数,python3已经将urlretrieve()移到urllib.reques ...

  5. SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)

    前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...

  6. 基于CAP模型设计企业级真正高可用的分布式锁

    来自:架构之美 1.CAP定律剖析 2000年Eric Brewer教授提出CAP猜想,2年后CAP猜想被Seth Gilbert和Nancy Lynch从理论上证明.CAP是Consitency(强 ...

  7. oracle 提取当天日志,powershell提取日志内容

    写了一个powershell提取日志内容的脚本,搜索oracle关于ORA的报错信息 #查找结果赋值 $d=Get-ChildItem  c:\test  -Recurse | where{" ...

  8. saltstack之(一)系统环境及本地yum源

    1.服务器环境 node1:192.168.3.1 node2:192.168.3.2 2.主机名和hosts文件 node1: node1.xkops.com --主机名 [root@node1 ~ ...

  9. 使用VMware桥接模式组建局域网测试MSMQ(二)

    上一篇讲了搭建VMware虚拟机实现与宿主机相互通信,环境已经就绪,现在就可以做MSMQ的分布式开发了. 本篇准备分四点介绍MSMQ: 1.MSMQ简介 2.MSMQ的安装 3.MSMQ编程开发 4. ...

最新文章

  1. 9月Python开源项目Top10
  2. KDD 2019高维稀疏数据上的深度学习Workshop论文汇总
  3. 折线分割平面(hdoj 2050,动态规划递推)
  4. JS操作frame框架
  5. 【408预推免复习】操作系统引论
  6. MobaXterm 12中文版
  7. 《Windows 系列》- 右击添加管理员权限
  8. 【案例】solr实现京东搜索功能
  9. pdf内容怎么复制到word文档里_pdf文件怎么放到word里?这招实在是太好用了
  10. 打开c盘_为什么你的C盘总是爆满?教你彻底清理C盘空间,瞬间提速50%
  11. linux 描述符 打开 个数,Linux下增大可打开文件描述符的最大数的方法
  12. 解决vue+php跨域问题
  13. 【AI视野·今日CV 计算机视觉论文速览 第193期】Fri, 7 May 2021
  14. fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统
  15. 关于webpack下载loader出现的问题(ERROR in ./src/img/timg.jpg Module build failed: ValidationError: File Loade)
  16. Linux搭建FTP服务使用案例
  17. maven中的命令行命令
  18. php服务器能运行java吗_将PHP与Java服务器接口
  19. 【机器学习】之 主成分分析PCA
  20. Java当中的IO流-时间api(下)-上

热门文章

  1. Spring框架—体系结构
  2. 剖析Picasso中的内存缓存机制——LruCache
  3. SDNU 1085.爬楼梯再加强版(矩阵快速幂)
  4. 工作中男女程序员对比,没注意原来差距这么大!你中招了吗?
  5. 金九银十,史上最强 Java 面试题整理。
  6. 进程分析命令(持续更新中)
  7. 洋葱第4场C和D题解……
  8. LWUIT显示中文问题
  9. 关于 数据文件自增长 的一点理解
  10. 多IE版本共存的解决方案—IETester(推荐)