Chinaunix首页 | 论坛 | 博客
  • 博客访问: 407351
  • 博文数量: 61
  • 博客积分: 1991
  • 博客等级: 上尉
  • 技术积分: 492
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-08 12:28
文章分类

全部博文(61)

文章存档

2011年(5)

2010年(21)

2009年(3)

2008年(4)

2007年(28)

我的朋友

分类: Oracle

2010-11-17 09:39:35

在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢?

1 性能上的比较
比如Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select * 
from t1, ( select distinct y from t2 ) t2


where t1.x = t2.y;

相对的

select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
for x in ( select * from t1 )
   loop
      if ( exists ( select null from t2 where y = x.x )
      then 
         OUTPUT THE RECORD
      end if
end loop
表 T1 不可避免的要被完全扫描一遍

分别适用在什么情况?
以子查询 ( select y from T2 )为考虑方向
如果子查询的结果集很大需要消耗很多时间,但是T1比较小执行( select null from t2 where y = x.x )非常快,那么exists就比较适合用在这里
相对应得子查询的结果集比较小的时候就应该使用in.

2 含义上的比较
在标准的scott/tiger用户下

   EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
17499ALLENSALESMAN76981981/02/201600.00300.0030
27521WARDSALESMAN76981981/02/221250.00500.0030
37566JONESMANAGER78391981/04/022975.0020
47654MARTINSALESMAN76981981/09/281250.001400.0030
57698BLAKEMANAGER78391981/05/012850.0030
67782CLARKMANAGER78391981/06/092450.0010
77788SCOTTANALYST75661987/04/193000.0020
87839KINGPRESIDENT 1981/11/175000.0010
97844TURNERSALESMAN76981981/09/081500.000.0030
107876ADAMSCLERK77881987/05/231100.0020
117900JAMESCLERK76981981/12/03950.0030
127902FORDANALYST75661981/12/033000.0020
137934MILLERCLERK77821982/01/231300.00 10

执行
SQL> select count(*) from emp where empno not in ( select mgr from emp );
COUNT(*)
----------
         0
SQL> select count(*) from emp T1
2 where not exists ( select null from emp T2 where t2.mgr = t1.empno ); -- 这里子查询中取出null并没有什么特殊作用,只是表示取什么都一样。
COUNT(*)
----------
         8
结果明显不同,问题就出在MGR=null的那条数据上。任何值X not in (null) 结果都不成立。
用一个小例子试验一下:
select * from dual where dummy not in ( NULL ) -- no rows selected
select * from dual where NOT( dummy not in ( NULL ) ) --no rows selected
知觉上这两句SQL总有一句会取出数据的,但是实际上都没有。SQL中逻辑表达式的值可以有三种结果(true false null)而null相当于false.
阅读(1388) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-17 16:34:12

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com