问 exist 用法

回复 收藏
sql
最近在学sql 学到exists的用法时很纠结

各位大哥们能不能给我讲解一下exists的执行过程?谢谢了
2011-07-01 00:53 举报
已邀请:
0

spain.yx

赞同来自:

有时候会将一列和一系列值相比较。最简单的办法就是在where 子句中使用子查询。在
where 子句中可以使用两种格式的子查询。
第一种格式是使用IN 操作符:
... where column in(select * from ... where ...);
第二种格式是使用EXIST 操作符:
... where exists (select 'X' from ...where ...);
我相信绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第
一种格式的效率高。在Oracle 中可以几乎将所有的IN 操作符子查询改写为使用EXISTS 的子查
询。
第二种格式中,子查询以‘select 'X'开始。运用EXISTS 子句不管子查询从表中抽取什么数
据它只查看where 子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在
where 语句中使用的列存在索引)。相对于IN 子句来说,EXISTS 使用相连子查询,构造起来要
比IN 子查询困难一些。
通过使用EXIST,Oracle 系统会首先检查主查询,然后运行子查询直到它找到第一个匹配
项,这就节省了时间。Oracle 系统在执行IN 子查询时,首先执行子查询,并将获得的结果列表
存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完
毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS 比使用IN 通常查询速度快的原
因。
同时应尽可能使用NOT EXISTS 来代替NOT IN,尽管二者都使用了NOT(不能使用索引
而降低速度),NOT EXISTS 要比NOT IN 查询效率更高。
0

spain.yx

赞同来自:

exists  与 in  属于SQL语句调优的内容,多学习一下相关的!

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: