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

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

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

    大漠駝鈴

    置身浩瀚的沙漠,方向最為重要,希望此blog能向大漠駝鈴一樣,給我方向和指引。
    Java,Php,Shell,Python,服務器運維,大數據,SEO, 網站開發、運維,云服務技術支持,IM服務供應商, FreeSwitch搭建,技術支持等. 技術討論QQ群:428622099
    隨筆 - 238, 文章 - 3, 評論 - 117, 引用 - 0
    數據加載中……

    SQL語句left join/right join/inner join 的用法比較(轉載)

    sql中left join、right join的簡單說明

    數據庫常見的join方式有三種:inner join, left outter join, right outter join(還有一種full join,因不常用,本文不討論)。這三種連接方式都是將兩個以上的表通過on條件語句,拼成一個大表。以下是它們的共同點:

    1. 關于左右表的概念。左表指的是在SQL語句中排在left join左邊的表,右表指的是排在left join右邊的表。
    2. 在拼成的大表中,左表排在左邊,右表排在右邊。
    3. on條件語句最好用=號對兩表相應的主外鍵進行連接。當然,也可以用其他操作符,如>, <, 來連接兩表的任一字段,此時的關系將非常復雜,連接后的記錄數也隨之而變得不確定。如果在一些特殊的場合中需要用到這種方式,必須通過簡單的實例加以確 認,否則,連接結果很可能不是我們所想要的!
    4. on條件語句不能省略。
    5. 可以連鎖使用join,每次使用join都令另一表與當前的表或連接的結果相連接。

    在下文中,用到了兩個表,"部門"表與"組織"表,其中,"部門"表有一名為"組織編號"的外鍵,指向"組織"表中的主鍵"編號"。

    inner join

    格式:select * from 部門 inner join 組織 on 部門.組織編號 = 組織.編號

    目的:將兩表中符合on條件的所有記錄都找出來。

    規律:

    1. 拼出的大表記錄不會增加。
    2. 如果左邊與右表的關系是一對多的關系,在選出的任一記錄中,假若右表有多個記錄與其對應,那么,連接后的左表,主鍵將不再唯一。

    典型應用:將存在多關系的引用表放在左表,將存在一關系的被引用表放在右表,通過=號將主外鍵進行連接,通過對右表設定過濾條件,選出相應的且主鍵唯一的左表記錄。

    備注:inner join 是默認的連接方式,可縮寫為join。

    轉化為where子句:

    select * from 部門, 組織 where 部門.組織編號 = 組織.編號

    left outter join

    格式: select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號

    格式: select * from 組織 left join 部門 on 組織.編號 = 部門.組織編號

    目的:將左表的所有記錄列出,右表中只要符合on條件的,與左表記錄相拼合,不符合條件的,填以null值。

    規律:

    1. 選出所有符合條件的左表,如果左邊與右表的關系是一對一的關系,則拼成的大表記錄不會改變。
    如果左邊與右表的關系是多對一的關系,則拼成的大表記錄也不會改變。
    如果左邊與右表的關系是一對多的關系,則拼成的大表記錄會增加。對于每一具有一對多關系的左表記錄,如果左表1:N與右表對應,那么會多出N-1條記錄。 例如,如果左表第一條記錄1:3對應于右表,多出2條記錄。如果左表第二條記錄1:2對應于右表,則再多出1條記錄。這樣,總共多出3條記錄。其他類推。
    2. 如果左邊與右表的關系是一對多的關系,在選出的任一記錄中,假若右表有多個記錄與其對應,那么,連接后的左表,主鍵將不再唯一。
    3. 如果左邊與右表的關系是一對多的關系,對于左表任一記錄,如果右表沒有記錄與其相對應,則全部填以null值。

    典型應用:將存在多關系的引用表放在左表,將存在一關系的被引用表放在右表,通過對右表設定過濾條件,選出相應的且主鍵唯一的左表記錄。

    備注:left outter join可用left join代替。在有些數據庫中,如HSqlDb, 只能使用left join而不能使用left outter join。

    轉化為where子句:

    select * from 部門, 組織 where 部門.組織編號 = 組織.編號


    right outter join

    格式: select * from 部門 right join 組織 on 部門.組織編號 = 組織.編號

    格式: select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號

    目的:將右表的所有記錄列出,左表中只要符合on條件的,與右表記錄相拼合,不符合條件的,填以null值。

    規律:(與left outter join相反)

    典型應用:可轉化成left outter join。例如

    select * from 組織 right join 部門 on 部門.組織編號 = 組織.編號

    select * from 部門 left join 組織 on 部門.組織編號 = 組織.編號
    的效果一樣




    假設有A,B兩個表。 

    表A記錄如下: 
    aID     aNum 
    1     a20050111 
    2     a20050112 
    3     a20050113 
    4     a20050114 
    5     a20050115 

    表B記錄如下: 
    bID     bName 
    1     2006032401 
    2     2006032402 
    3     2006032403 
    4     2006032404 
    8     2006032408 

    -------------------------------------------- 
    1.left join 
    sql語句如下:  
    select * from A 
    left join B  
    on A.aID = B.bID 

    結果如下: 
    aID     aNum     bID     bName 
    1     a20050111    1     2006032401 
    2     a20050112    2     2006032402 
    3     a20050113    3     2006032403 
    4     a20050114    4     2006032404 
    5     a20050115    NULL     NULL 

    (所影響的行數為 5 行) 
    結果說明: 
    left join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的. 
    換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中為: A.aID = B.bID). 
    B表記錄不足的地方均為NULL. 
    -------------------------------------------- 
    2.right join 
    sql語句如下:  
    select * from A 
    right join B  
    on A.aID = B.bID 

    結果如下: 
    aID     aNum     bID     bName 
    1     a20050111    1     2006032401 
    2     a20050112    2     2006032402 
    3     a20050113    3     2006032403 
    4     a20050114    4     2006032404 
    NULL     NULL     8     2006032408 

    軟件開發網 www.mscto.com


    (所影響的行數為 5 行) 
    結果說明: 
    仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充. 
    -------------------------------------------- 
    3.inner join 
    sql語句如下:  
    select * from A 
    innerjoin B  
    on A.aID = B.bID 

    結果如下: 
    aID     aNum     bID     bName 
    1     a20050111    1     2006032401 
    2     a20050112    2     2006032402 
    3     a20050113    3     2006032403 
    4     a20050114    4     2006032404 

    結果說明: 
    很明顯,這里只顯示出了 A.aID = B.bID的記錄.這說明inner join并不以誰為基礎,它只顯示符合條件的記錄. 
    -------------------------------------------- 
    PS:  
    LEFT JOIN操作用于在任何的 FROM 子句中,組合來源表的記錄。使用 LEFT JOIN 運算來創建一個左邊外部聯接。左邊外部聯接將包含了從第一個(左邊)開始的兩個表中的全部記錄,即使在第二個(右邊)表中并沒有相符值的記錄。  

    語法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2  

    說明:table1, table2參數用于指定要將記錄組合的表的名稱。 
    field1, field2參數指定被聯接的字段的名稱。且這些字段必須有相同的數據類型及包含相同類型的數據,但它們不需要有相同的名稱。 
    compopr參數指定關系比較運算符:"=", "<", ">", "<=", ">=" 或 "<>"。 
    如果在INNER JOIN操作中要聯接包含Memo 數據類型或 OLE Object 數據類型數據的字段,將會發生錯誤  

    注:left和right是外連接,Inner是內連接。

    posted on 2009-02-08 10:08 草原上的駱駝 閱讀(2461) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 91在线手机精品免费观看| 亚洲裸男gv网站| 久久久亚洲欧洲日产国码aⅴ | 免费国产黄线在线观看| 久久久久国产成人精品亚洲午夜 | 亚洲va中文字幕无码久久不卡| 亚洲日韩一中文字暮| 无码精品国产一区二区三区免费 | 亚洲最新在线视频| a级毛片免费观看视频| 国产午夜免费福利红片| 亚洲国产视频一区| 成全视频在线观看免费| 免费国产a国产片高清| 亚洲天堂2016| 91高清免费国产自产拍2021| 综合亚洲伊人午夜网 | 女人18毛片a级毛片免费| 久久亚洲日韩看片无码| 中文在线观看免费网站| 免费永久国产在线视频| 亚洲综合小说另类图片动图 | 久久久精品视频免费观看 | 成人亚洲性情网站WWW在线观看| 亚洲精品久久无码av片俺去也| 国产免费不卡视频| 67pao强力打造67194在线午夜亚洲| 国产午夜无码片免费| 亚洲国产精品碰碰| 美女尿口扒开图片免费| 啦啦啦手机完整免费高清观看| 亚洲国产精品专区| 1000部啪啪未满十八勿入免费| 亚洲国产第一站精品蜜芽| 国产精品免费一区二区三区| 亚洲成av人在片观看| 精品成人一区二区三区免费视频| 全免费a级毛片免费看无码| 中文字幕无码亚洲欧洲日韩| 黄色片在线免费观看| 亚洲六月丁香六月婷婷蜜芽|