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

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

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

    posts - 167,  comments - 30,  trackbacks - 0
    IN
    確定給定的值是否與子查詢或列表中的值相匹配。

    EXISTS
    指定一個子查詢,檢測行的存在。

    比較使用 EXISTS 和 IN 的查詢

    這個例子比較了兩個語義類似的查詢。
    第一個查詢使用 EXISTS 而第二個查詢使用 IN。注意兩個查詢返回相同的信息。
    SELECT DISTINCT pub_name
    FROM publishers
    WHERE EXISTS
    (SELECT *
    FROM titles
    WHERE pub_id = publishers.pub_id
    AND type = 'business')

    -- Or, using the IN clause:

    SELECT distinct pub_name
    FROM publishers
    WHERE pub_id IN
    (SELECT pub_id
    FROM titles
    WHERE type = 'business')

    下面是任一查詢的結(jié)果集:
    pub_name
    ----------------------------------------
    Algodata Infosystems
    New Moon Books


    exits 相當(dāng)于存在量詞:表示集合存在,也就是集合不為空只作用一個集合.
    例如 exist P表示P不空時(shí)為真; not exist P表示p為空時(shí)為真in表示一個標(biāo)量和一元關(guān)系的關(guān)系。
    例如:s in P表示當(dāng)s與P中的某個值相等時(shí) 為真; s not in P 表示s與P中的每一個值都不相等時(shí) 為真

    在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;

    相對的

    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就比較適合用在這里
    相對應(yīng)得子查詢的結(jié)果集比較小的時(shí)候就應(yīng)該使用in.

    in和exists
    in 是把外表和內(nèi)表作hash 連接,而exists是對外表作loop循環(huán),每次loop循環(huán)再對內(nèi)表進(jìn)行查詢。
    一直以來認(rèn)為exists比in效率高的說法是不準(zhǔn)確的。
    如果查詢的兩個表大小相當(dāng),那么用in和exists差別不大。

    如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
    例如:表A(小表),表B(大表)
    1:
    select * from A where cc in (select cc from B)
    效率低,用到了A表上cc列的索引;
    select * from A where exists(select cc from B where cc=A.cc)
    效率高,用到了B表上cc列的索引。

    相反的
    2:
    select * from B where cc in (select cc from A)
    效率高,用到了B表上cc列的索引;
    select * from B where exists(select cc from A where cc=B.cc)
    效率低,用到了A表上cc列的索引。

    not in 和not exists
    如果查詢語句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描,沒有用到索引;
    而not extsts 的子查詢依然能用到表上的索引。
    所以無論那個表大,用not exists都比not in要快。

    in 與 =的區(qū)別
    select name from student where name in ('zhang','wang','li','zhao');


    select name from student where name='zhang' or name='li' or name='wang' or name='zhao'的結(jié)果是相同的。
    posted on 2009-03-31 13:08 David1228 閱讀(4352) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    <2009年3月>
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章檔案

    新聞分類

    新聞檔案

    相冊

    收藏夾

    Java

    Linux知識相關(guān)

    Spring相關(guān)

    云計(jì)算/Linux/虛擬化技術(shù)/

    友情博客

    多線程并發(fā)編程

    開源技術(shù)

    持久層技術(shù)相關(guān)

    搜索

    •  

    積分與排名

    • 積分 - 358612
    • 排名 - 154

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久免费香蕉视频| 国产av无码专区亚洲国产精品| 国产男女猛烈无遮挡免费视频网站 | 久久一本岛在免费线观看2020| 亚洲欧洲∨国产一区二区三区| 丝袜足液精子免费视频| 亚洲精品天堂无码中文字幕| 亚洲国产精品久久久久久| 亚洲国产av一区二区三区| 成人人观看的免费毛片| 精品免费久久久久久久| 黄页免费在线观看| jizz免费观看| aa午夜免费剧场| 特级aa**毛片免费观看| 亚洲AV无码男人的天堂| 亚洲色少妇熟女11p| 亚洲av日韩av综合| 亚洲欧洲精品视频在线观看| 亚洲gv白嫩小受在线观看| 国产av无码专区亚洲av果冻传媒| 免费国产黄网站在线观看视频| 亚洲免费人成视频观看| 久久久亚洲欧洲日产国码aⅴ| 91嫩草国产在线观看免费| 亚洲成人在线免费观看| 爱丫爱丫影院在线观看免费| a级男女仿爱免费视频| 成在人线av无码免费高潮喷水 | 国产免费久久精品99久久| 免费视频精品一区二区| 国产亚洲综合久久| 添bbb免费观看高清视频| 国产精品亚洲а∨天堂2021 | 理论亚洲区美一区二区三区| 亚洲成a人片在线观看天堂无码| 亚洲综合伊人久久综合| 伊人久久大香线蕉亚洲五月天| 国产免费不卡视频| 在线看片韩国免费人成视频| 免费观看激色视频网站bd|