<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 56, comments - 54, trackbacks - 0, articles - 4
       ::  ::  :: 聯(lián)系 :: 聚合  :: 管理

    比較Oracle SQL中的IN & EXISTS

    Posted on 2006-04-18 16:01 Terry的Blog 閱讀(23029) 評(píng)論(5)  編輯  收藏 所屬分類: oracle

    在Oracle SQL中取數(shù)據(jù)時(shí)有時(shí)要用到in 和 exists 那么他們有什么區(qū)別呢?

    1 性能上的比較
    比如Select * from T1 where x in ( select y from T2 )
    執(zhí)行的過程相當(dāng)于:
    select *
    ? from t1, ( select distinct y from t2 ) t2
    ?where t1.x = t2.y;

    相對(duì)的

    select * from t1 where exists ( select null from t2 where y = x )
    執(zhí)行的過程相當(dāng)于:
    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 )為考慮方向
    如果子查詢的結(jié)果集很大需要消耗很多時(shí)間,但是T1比較小執(zhí)行( select null from t2 where y = x.x )非常快,那么exists就比較適合用在這里
    相對(duì)應(yīng)得子查詢的結(jié)果集比較小的時(shí)候就應(yīng)該使用in.

    2 含義上的比較
    在標(biāo)準(zhǔn)的scott/tiger用戶下

    ??? EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    1 7499 ALLEN SALESMAN 7698 1981/02/20 1600.00 300.00 30
    2 7521 WARD SALESMAN 7698 1981/02/22 1250.00 500.00 30
    3 7566 JONES MANAGER 7839 1981/04/02 2975.00 20
    4 7654 MARTIN SALESMAN 7698 1981/09/28 1250.00 1400.00 30
    5 7698 BLAKE MANAGER 7839 1981/05/01 2850.00 30
    6 7782 CLARK MANAGER 7839 1981/06/09 2450.00 10
    7 7788 SCOTT ANALYST 7566 1987/04/19 3000.00 20
    8 7839 KING PRESIDENT   1981/11/17 5000.00 10
    9 7844 TURNER SALESMAN 7698 1981/09/08 1500.00 0.00 30
    10 7876 ADAMS CLERK 7788 1987/05/23 1100.00 20
    11 7900 JAMES CLERK 7698 1981/12/03 950.00 30
    12 7902 FORD ANALYST 7566 1981/12/03 3000.00 20
    13 7934 MILLER CLERK 7782 1982/01/23 1300.00   10

    執(zhí)行
    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
    結(jié)果明顯不同,問題就出在MGR=null的那條數(shù)據(jù)上。任何值X not in (null)? 結(jié)果都不成立。
    用一個(gè)小例子試驗(yàn)一下:
    select * from dual where dummy not in ( NULL ) -- no rows selected
    select * from dual where NOT( dummy not in ( NULL ) ) --no rows selected
    知覺上這兩句SQL總有一句會(huì)取出數(shù)據(jù)的,但是實(shí)際上都沒有。SQL中邏輯表達(dá)式的值可以有三種結(jié)果(true false null)而null相當(dāng)于false.



    評(píng)論

    # re: 比較Oracle SQL中的IN & EXISTS  回復(fù)  更多評(píng)論   

    2007-11-30 10:16 by bluesmile
    新手報(bào)道

    # re: 比較Oracle SQL中的IN & EXISTS  回復(fù)  更多評(píng)論   

    2008-11-03 12:26 by ORACLE小菜鳥
    謝謝高手分享!!!

    # re: 比較Oracle SQL中的IN & EXISTS  回復(fù)  更多評(píng)論   

    2009-07-01 11:05 by
    不錯(cuò)不錯(cuò)。 但是不是我說需要的

    # re: 比較Oracle SQL中的IN & EXISTS  回復(fù)  更多評(píng)論   

    2009-07-11 16:03 by cits
    good 正是我所需要的,謝謝

    # re: 比較Oracle SQL中的IN & EXISTS  回復(fù)  更多評(píng)論   

    2014-07-14 14:22 by we
    不知所云
    主站蜘蛛池模板: 亚洲成人免费电影| 一级特黄录像免费播放中文版| 最近中文字幕大全中文字幕免费| 亚洲熟女少妇一区二区| 国产精品免费视频观看拍拍| 精品国产亚洲男女在线线电影 | ww在线观视频免费观看| 久久久亚洲AV波多野结衣| 免费的全黄一级录像带| 亚洲av最新在线网址| 人人玩人人添人人澡免费| 亚洲av伊人久久综合密臀性色| 国产免费无码AV片在线观看不卡| 久久精品九九亚洲精品天堂| 在线观看免费无码专区| 久久亚洲AV午夜福利精品一区| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 九一在线完整视频免费观看| 亚洲七七久久精品中文国产| 一级毛片免费播放试看60分钟| 国产午夜亚洲精品理论片不卡| 中国精品一级毛片免费播放| 亚洲国产另类久久久精品黑人| 两个人看的www免费视频| 亚洲av无码av制服另类专区| 老汉精品免费AV在线播放| 亚洲欧洲日产韩国在线| 久久精品女人天堂AV免费观看| 亚洲最大黄色网站| 无人在线观看完整免费版视频| 亚洲欧好州第一的日产suv| 四虎影视永久免费观看地址| 男女男精品网站免费观看| 亚洲人精品午夜射精日韩| 日本黄色动图免费在线观看| 亚洲成a人片在线观看播放| 动漫黄网站免费永久在线观看| 亚洲精品GV天堂无码男同| 亚洲 综合 国产 欧洲 丝袜| 波霸在线精品视频免费观看| 亚洲天堂中文字幕|