第四節(jié) union的使用

字號:

第三節(jié) 四種鏈接的區(qū)別及用法
    鏈接:
    作為動(dòng)詞,它表示將兩個(gè)或多個(gè)表的內(nèi)容結(jié)合在一起并產(chǎn)生一個(gè)結(jié)果集,該結(jié)果集對每個(gè)表的列和行進(jìn)行合并。表的聯(lián)接一般都使用它們共有的數(shù)據(jù)。例如,您可以對有一個(gè)共同 pub_id 列的 titles 表和 publishers 表聯(lián)接,產(chǎn)生一個(gè)包含書名信息和出版商信息的結(jié)果集。
    作為名詞,表示對表進(jìn)行聯(lián)接的過程或結(jié)果,如在術(shù)語"內(nèi)部聯(lián)接"中表示對表聯(lián)接的一種特殊的方法。
    聯(lián)接條件(join condition)
    一個(gè)比較子句,它指定了表是如何通過它們的聯(lián)接字段相聯(lián)系的。最普通的聯(lián)接條件是相等(一個(gè)等聯(lián)接),在等聯(lián)接中聯(lián)接字段的值必須相同。例如,您可以通過在 titles 表和 publishers 表的 pub_id 列中查找相匹配的值聯(lián)接這兩個(gè)表。然而,任何比較運(yùn)算符都可以是比較條件的一部分。
    內(nèi)部聯(lián)接(inner join)
    一個(gè)聯(lián)接,在該聯(lián)接中只有當(dāng)聯(lián)接字段的值滿足某些特定的準(zhǔn)則時(shí)才將兩個(gè)表的記錄進(jìn)行結(jié)合并添加到一個(gè)查詢結(jié)果中。例如,在查詢設(shè)計(jì)器視圖中,表之間的缺省聯(lián)接是一個(gè)內(nèi)部聯(lián)接,它只有當(dāng)聯(lián)接字段的值相等時(shí)才從兩個(gè)表中選擇記錄。
    外部聯(lián)接(outer join)
    一個(gè)聯(lián)接,該聯(lián)接還包括那些和聯(lián)接表中記錄不相關(guān)的記錄。您可以創(chuàng)建一個(gè)外部聯(lián)接的三種變形來指定所包括的不匹配行:左外部聯(lián)接、右外部聯(lián)接和完全外部聯(lián)接。
    左外部聯(lián)接(left outer join)
    一種外部聯(lián)接類型,在該聯(lián)接中包括第一個(gè)命名表(左邊的表,它出現(xiàn)在 JOIN 子句的最左邊)的所有行。右邊表中沒有匹配的行不出現(xiàn)。例如,您可以在 titles 表和 publishers 表之間創(chuàng)建一個(gè)左外部聯(lián)接,以包括所有的書名,不論書名有無出版商的信息。
    右外部聯(lián)接(right outer join)
    一種外部聯(lián)接,在該聯(lián)接中包括第二個(gè)命名表(右邊的表,出現(xiàn)在 JOIN 子句中的最右邊)的所有行。不包括左邊表中沒有匹配的行。例如,titles 表和 publishers 表之間的一個(gè)右外部聯(lián)接將包括所有的出版商,甚至包括那些在 titles 表中沒有書名的出版商。
    以上是MSDN中對鏈接的定義?,F(xiàn)在我們就從這四種鏈接所使用的不同方法來看他們的結(jié)果有什么不同。
    titles 表
    sh(書號) ph(出版商編號)
    232342 001
    0432 003
    82478123 005
    publishers 表
    ph(出版商編號) mc(出版商名稱)
    001 紅虎
    002 rmh
    003 hazl
    現(xiàn)要把這兩個(gè)表的內(nèi)容合成如下的表結(jié)構(gòu):
    sh(書號) ph(出版商編號) mc(出版商名稱)
    現(xiàn)在看看采用四種鏈接方法的結(jié)果會(huì)有什么不同。先說說他們的命令:
    內(nèi)聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
     from titles inner join publishers ; &&內(nèi)聯(lián)接中的inner是可以省略的
     on titles.ph=publishers.ph
    外聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
     from titles outer join publishers ;
     on titles.ph=publishers.ph
    左聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
     from titles left join publishers ;
     on titles.ph=publishers.ph
    右聯(lián)接:
    sele titles.sh,publishers.ph,publishers.mc ;
     from titles right join publishers ;
     on titles.ph=publishers.ph
    大家可能看到,除了在join之前的那個(gè)關(guān)鍵字不同之外,其他地方是一模一樣的,鏈接條件(即on那一部分)也是一樣的。結(jié)果:
    內(nèi)鏈接:
    232342 001 紅虎
    0432 003 hazl
    全鏈接:
    232342 001 001 紅虎
    Null Null 002 rmh
    0432 003 003 hazl
    82478123 005 Null Null
    左鏈接:
    232342 001 001 紅虎
    0432 003 003 hazl
    82478123 005 Null Null
    右鏈接:
    232342 001 001 紅虎
    Null Null 002 rmh
    0432 003 003 hazl
    所以我們很容易記?。?BR>    1、左鏈接:就是以join的左邊那個(gè)表為"主",以titles.ph=publishers.ph為判斷標(biāo)準(zhǔn),不管右邊的表有沒有對應(yīng)的記錄,都要把左邊表的記錄放在結(jié)果中去,但右邊表沒有相應(yīng)的記錄那應(yīng)該放個(gè)什么數(shù)值進(jìn)去?答案是就放個(gè)Null,表示沒有。在左鏈接中,某記錄在右邊表,卻不在左邊表,那是不放進(jìn)去結(jié)果去的,原因是左邊表才是"主",要不要放由它決定:它有的,就一定放進(jìn)去,它沒有的,就不要了。
    2、右鏈接:和左鏈接一樣,只不過為"主"的一方調(diào)過來了,換成是由右邊做"主"。
    3、內(nèi)鏈接:和左、右鏈接不同,它一定要左、右兩邊都有的記錄才會(huì)放進(jìn)結(jié)果,如果有某個(gè)記錄不存在于任何一邊,那這個(gè)記錄是不會(huì)出現(xiàn)在結(jié)果中去的。
    4、外鏈接:跟內(nèi)聯(lián)接相,反,相當(dāng)于左、右鏈接的合并:不管什么情況,只要某個(gè)記錄出現(xiàn)在這兩個(gè)表,就一定會(huì)出現(xiàn)在結(jié)果中去,然后象左、右鏈接的處理方法一樣,用Null來填充沒有對應(yīng)值的字段。
    注:以上說的"有"、"沒有",意思是以titles.ph=publishers.ph為判斷標(biāo)準(zhǔn)來下決定的。比如當(dāng)前titles表的ph是"002",而在publishers中,沒有一個(gè)記錄的ph的值是"002"的,所以就說"002"這個(gè)值在titles有,在publisher中沒有,這樣titles.ph為"002"的記錄就會(huì)被選中,最后放在結(jié)果中去。