欢迎来到天天文库
浏览记录
ID:34724914
大小:82.68 KB
页数:4页
时间:2019-03-10
《oracle中exist与in的区别》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在OracleSQL中取数据时有时要用到in和exists那么他们有什么区别呢?1性能上的比较比如Select*fromT1wherexin(selectyfromT2)执行的过程相当于:select* fromt1,(selectdistinctyfromt2)t2 wheret1.x=t2.y;相对的select*fromt1whereexists(selectnullfromt2wherey=x)执行的过程相当于:forxin(select*fromt1) loop if(exists(selectnullfromt
2、2wherey=x.x) then OUTPUTTHERECORD endifendloop表 T1不可避免的要被完全扫描一遍分别适用在什么情况?以子查询 (selectyfromT2)为考虑方向如果子查询的结果集很大需要消耗很多时间,但是T1比较小执行(selectnullfromt2wherey=x.x)非常快,那么exists就比较适合用在这里相对应得子查询的结果集比较小的时候就应该使用in.2含义上的比较在标准的scott/tiger用户下EMPNOENAMEJOBMGRHIREDATESALC
3、OMMDEPTNO17499ALLENSALESMAN76981981/02/201600.00300.003027521WARDSALESMAN76981981/02/221250.00500.003037566JONESMANAGER78391981/04/022975.002047654MARTINSALESMAN76981981/09/281250.001400.003057698BLAKEMANAGER78391981/05/012850.003067782CLARKMANAGER78391981/06/092450.00
4、1077788SCOTTANALYST75661987/04/193000.002087839KINGPRESIDENT 1981/11/175000.001097844TURNERSALESMAN76981981/09/081500.000.0030107876ADAMSCLERK77881987/05/231100.0020117900JAMESCLERK76981981/12/03950.0030127902FORDANALYST75661981/12/033000.0020137934MILLERCLERK77821982/
5、01/231300.00 10执行SQL>selectcount(*)fromempwhereempnonotin(selectmgrfromemp);COUNT(*)---------- 0SQL>selectcount(*)fromempT1 2 wherenotexists(selectnullfromempT2wheret2.mgr=t1.empno);--这里子查询中取出null并没有什么特殊作用,只是表示取什么都一样。COUNT(*)---------- 8结果明显不同,问题就出在MGR=nu
6、ll的那条数据上。任何值Xnotin(null) 结果都不成立。用一个小例子试验一下:select*fromdualwheredummynotin(NULL)--norowsselectedselect*fromdualwhereNOT(dummynotin(NULL))--norowsselected知觉上这两句SQL总有一句会取出数据的,但是实际上都没有。SQL中逻辑表达式的值可以有三种结果(truefalsenull)而null相当于false.
此文档下载收益归作者所有