亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學習啦 > 學習英語 > 專業(yè)英語 > 計算機英語 > 數(shù)據(jù)庫in和exists的用法

      數(shù)據(jù)庫in和exists的用法

      時間: 長思709 分享

      數(shù)據(jù)庫in和exists的用法

        數(shù)據(jù)庫in和exists的用法的用法你知道嗎?下面小編就跟你們詳細介紹下數(shù)據(jù)庫in和exists的用法的用法,希望對你們有用。

        數(shù)據(jù)庫in和exists的用法的用法如下:

        SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC)

        NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進行關(guān)聯(lián),而且關(guān)聯(lián)時,需要用索引,這樣就可以加快速度

        select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)

        exists是用來判斷是否存在的,當exists(查詢)中的查詢存在結(jié)果時則返回真,否則返回假。not exists則相反。

        exists做為where 條件時,是先對where 前的主查詢詢進行查詢,然后用主查詢的結(jié)果一個一個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結(jié)果,否則不輸出。

        in和exists

        in 是把外表和內(nèi)表作hash 連接,而exists是對外表作loop循環(huán),每次loop循環(huán)再對內(nèi)表進行查詢。一直以來認為exists比in效率高的說法是不準確的。

        如果查詢的兩個表大小相當,那么用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)外表都進行全表掃描,沒有用到索引;而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é)果是相同的。

        例子如下(即exists返回where后2個比較的where子句中相同值,not exists則返回where子句中不同值):

        exists (sql 返回結(jié)果集為真)

        not exists (sql 不返回結(jié)果集為真)

        如下:

        表A

        ID NAME

        1 A1

        2 A2

        3 A3

        表B

        ID AID NAME

        1 1 B1

        2 2 B2

        3 2 B3

        表A和表B是一對多的關(guān)系 A.ID --> B.AID

        SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.AID)

        執(zhí)行結(jié)果為

        1 A1

        2 A2

        原因可以按照如下分析

        SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 1)

        -->SELECT * FROM B WHERE B.AID = 1有值返回真所以有數(shù)據(jù)

        SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 2)

        -->SELECT * FROM B WHERE B.AID = 2有值返回真所以有數(shù)據(jù)

        SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 3)

        -->SELECT * FROM B WHERE B.AID = 3無值返回真所以沒有數(shù)據(jù)

        NOT EXISTS 就是反過來

        SELECT ID , NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID = B.AID)

        執(zhí)行結(jié)果為

        3 A3

        sql in與exists區(qū)別

        IN

        確定給定的值是否與子查詢或列表中的值相匹配。

        EXISTS

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

        比較使用 EXISTS 和 IN 的查詢

        這個例子比較了兩個語義類似的查詢。第一個查詢使用 EXISTS 而第二個查詢使用 IN。注意兩個查詢返回相同的信息。

        USE pubs

        GO

        SELECT DISTINCT pub_name

        FROM publishers

        WHERE EXISTS

        (SELECT *

        FROM titles

        WHERE pub_id = publishers.pub_id

        AND type = 'business')

        GO

        -- Or, using the IN clause:

        USE pubs

        GO

        SELECT distinct pub_name

        FROM publishers

        WHERE pub_id IN

        (SELECT pub_id

        FROM titles

        WHERE type = 'business')

        GO

        下面是任一查詢的結(jié)果集:

        pub_name

        ----------------------------------------

        Algodata Infosystems

        New Moon Books

        (2 row(s) affected)

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

        in和exists

        in 是把外表和內(nèi)表作hash 連接,而exists是對外表作loop循環(huán),每次loop循環(huán)再對內(nèi)表進行查詢。

        一直以來認為exists比in效率高的說法是不準確的。

        如果查詢的兩個表大小相當,那么用in和exists差別不大。

        全文:

        in和exists

        in 是把外表和內(nèi)表作hash 連接,而exists是對外表作loop循環(huán),每次loop循環(huán)再對內(nèi)表進行查詢。

        一直以來認為exists比in效率高的說法是不準確的。

        如果查詢的兩個表大小相當,那么用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)外表都進行全表掃描,沒有用到索引;

        而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é)果是相同的。

      543084