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

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

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

    孤燈野火
    暢想的天空
    posts - 2,comments - 4,trackbacks - 0

    left join 和 left outer join 的區別

    通俗的講:  
      A   
    left   join   B   的連接的記錄數與A表的記錄數同  
      A   
    right   join   B   的連接的記錄數與B表的記錄數同    
      A   
    left   join   B   等價B   right   join   A  
       
       
      
    table   A:  
    Field_K,   Field_A  
      1                       a  
      
    3                       b  
      
    4                       c  
       
      
    table   B:  
      Field_K,   Field_B  
      
    1                       x  
      
    2                       y  
      
    4                       z  
       
      
    select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B  
      
    from   a   left   join   b   on   a.Field_K=b.Field_K  
       
      Field_K         Field_A         Field_K         Field_B          
      
    ----------   ----------   ----------   ----------    
      1                     a                     1                     x                    
      
    3                     b                     NULL               NULL  
      
    4                     c                     4                     z                    
       
      
    select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B  
      
    from   a   right   join   b   on   a.Field_K=b.Field_K  
       
      Field_K         Field_A         Field_K         Field_B          
      
    ----------   ----------   ----------   ----------    
      1                     a                     1                     x                    
      
    NULL               NULL               2                     y                    
      
    4                     c                     4                     z       --

    舉個例子:  
      假設a表和b表的數據是這樣的。  
      a                         b    
      id     name  id     stock   
      
    1  a             1         15  
      
    2         b             2         50  
      
    3         c                  
       
      
    select   *   from   a   inner   join   b   on   a.id=b.id  
      這個語法是連接查詢中的內連接,它產生的結果是  
      兩個表相匹配的記錄出現在結果列表中。  
      根據上面的表,出現的結果是這樣的  
      a.id     name     b.id     stock  
      
    1       a             1         15  
      
    2             b             2         50  
      
    ----------------------------  
      select   *   from   a,b   where   a.id=b.id  
      這個語法是內連接的另外一種寫法,其執行結果與inner   
    join   一樣  
       
      
    --------------------------------    
       
      
    select   *   from   a   left/right   join   b   on   a.id=b.id  
      這個是外連接語法中的左外連接或右外連接  
      如果是左外連接的話,它將顯示a表的所有記錄,  
      
    select   a.*,b.*   from   a   left   join   b   on   a.id=b.id  
      查詢的結果是這樣的:  
      a.id     name     b.id     stock  
      
    1         a         1             15  
      
    2               b         2             50  
      
    3               c       null         null   
      
    --------------------------------------------  
      如果是右外連接的話,它將顯示b表的所有記錄,  
      
    select   a.*,b.*   from   a   right   join   b   on   a.id=b.id  
      查詢的結果是這樣的:  
      a.id     name     b.id     stock  
      
    1         a         1             15  
      
    2               b         2             50   


    --

    select   a.*,b.*   from   a   left   join   b   on   a.k   =   b.k    
      
    select   a.*,b.*   from   a   left   outer   join   b   on   a.k   =b.k  
      
    ----------上面兩種一樣left   join是left   outer   join的簡寫  
      select   a.*,b.*   from   a   left   inner   join   b   on   a.k   =   b.k    
      沒有這種寫法,錯誤的語句.


    --

    在你要使用多個left   join的時候  
      比如說10個  
      我們把10個全都寫成left   join的形式  
      然后再SQL讓他自動運行一下,它會把最后一次出現的left   join變成left   
    outer   join  
      所以依此推理,最后一個left   join會以left   
    outer   join的形式存在  
      當然,不管變不變對結果的顯示沒有任何影響  
      希望我的實驗能對你有所幫助   


    --

    使用關系代數合并數據
    1 關系代數
    合并數據集合的理論基礎是關系代數,它是由E.F.Codd于1970年提出的。
    在關系代數的形式化語言中:
    ?        用表、或者數據集合表示關系或者實體。
    ?        用行表示元組。
    ?        用列表示屬性。
    關系代數包含以下8個關系運算符
    ?        選取――返回滿足指定條件的行。
    ?        投影――從數據集合中返回指定的列。
    ?        笛卡爾積――是關系的乘法,它將分別來自兩個數據集合中的行以所有可能的方式進行組合。
    ?        并――關系的加法和減法,它可以在行的方向上合并兩個表中的數據,就像把一個表壘在另一個表之上一樣。
    ?        交――返回兩個數據集合所共有的行。
    ?        差――返回只屬于一個數據集合的行。
    ?        連接――在水平方向上合并兩個表,其方法是:將兩個表中在共同數據項上相互匹配的那些行合并起來。
    ?        除――返回兩個數據集之間的精確匹配。
    此外,作為一種實現現代關系代數運算的方法,SQL還提供了:
    ?        子查詢――類似于連接,但更靈活;在外部查詢中,方式可以使用表達式、列表或者數據集合的地方都可以使用子查詢的結果。
    本章將主要講述多種類型的連接、簡單的和相關的子查詢、幾種類型的并、關系除以及其他的內容。
    2 使用連接
    2.1 連接類型
    在關系代數中,連接運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個數據集合的乘運算,然后對生成的結果集合進行選取運算,確保只把分別來自兩個數據集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個數據集合(通常是表),并產生一個新的結果集合,其方法是將一個數據源中的行于另一個數據源中和它匹配的行組合成一個新元組。
    SQL提供了多種類型的連接方式,它們之間的區別在于:從相互交疊的不同數據集合中選擇用于連接的行時所采用的方法不同。
    連接類型        定義
    內連接        只連接匹配的行
    左外連接        包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
    右外連接        包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
    全外連接        包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
    (H)(theta)連接        使用等值以外的條件來匹配左、右兩個表中的行
    交叉連接        生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配
    在INFORMIX中連接表的查詢
    如果FROM子句指定了多于一個表引用,則查詢會連接來自多個表的行。連接條件指定各列之間(每個表至少一列)進行連接的關系。因為正在比較連接條件中的列,所以它們必須具有一致的數據類型。
    SELECT語句的FROM子句可以指定以下幾種類型的連接
    FROM子句關鍵字        相應的結果集
    CROSS JOIN        笛卡爾乘積(所有可能的行對)
    INNER JOIN        僅對滿足連接條件的CROSS中的列
    LEFT OUTER JOIN        一個表滿足條件的行,和另一個表的所有行
    RIGHT OUTER JOIN        與LEFT相同,但兩個表的角色互換
    FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有行的超集

    2.2 內連接(Inner Join
    內連接是最常見的一種連接,它頁被稱為普通連接,而E.FCodd最早稱之為自然連接。
    下面是ANSI SQL-92標準
    select *
    from  t_institution i
    inner join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = "5801"
    其中inner可以省略。
    等價于早期的連接語法
    select *
    from t_institution i, t_teller t
    where i.inst_no = t.inst_no
    and i.inst_no = "5801"

    2.3 外連接
    2.3.1        左外連接(Left Outer Jion)
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    其中outer可以省略。
    2.3.2        右外連接(Rigt Outer Jion)
    select *
    from  t_institution i
    right outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.3        全外連接(Full Outer)
    全外連接返回參與連接的兩個數據集合中的全部數據,無論它們是否具有與之相匹配的行。在功能上,它等價于對這兩個數據集合分別進行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個結果集合并為一個結果集。
    在現實生活中,參照完整性約束可以減少對于全外連接的使用,一般情況下左外連接就足夠了。在數據庫中沒有利用清晰、規范的約束來防范錯誤數據情況下,全外連接就變得非常有用了,你可以使用它來清理數據庫中的數據。
    select *
    from  t_institution i
    full outer join t_teller t
    on i.inst_no = t.inst_no
    2.3.4        外連接與條件配合使用
    當在內連接查詢中加入條件是,無論是將它加入到join子句,還是加入到where子句,其效果是完全一樣的,但對于外連接情況就不同了。當把條件加入到 join子句時,SQL Server、Informix會返回外連接表的全部行,然后使用指定的條件返回第二個表的行。如果將條件放到where子句中,SQL Server將會首先進行連接操作,然后使用where子句對連接后的行進行篩選。下面的兩個查詢展示了條件放置位子對執行結果的影響:
    條件在join子句
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    and i.inst_no = “5801
    結果是:
    inst_no    inst_name            inst_no    teller_no  teller_name
    5801       天河區               5801       0001       tom
    5801       天河區               5801       0002       david
    5802       越秀區
    5803       白云區
    條件在where子句
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = “5801
    結果是:
    inst_no    inst_name            inst_no    teller_no  teller_name
    5801       天河區               5801       0001       tom
    5801       天河區               5801       0002       david

    2.4 自身連接
    自身連接是指同一個表自己與自己進行連接。這種一元連接通常用于從自反關系(也稱作遞歸關系)中抽取數據。例如人力資源數據庫中雇員與老板的關系。
    下面例子是在機構表中查找本機構和上級機構的信息。
    select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
    from t_institution i
    join t_institution s
    on i.superior_inst = s.inst_no

    結果是:
    superior_inst sup_inst_name        inst_no    inst_name
    800           廣州市               5801       天河區
    800           廣州市               5802       越秀區
    800           廣州市               5803       白云區

    2.5 交叉(無限制) 連接
    交叉連接用于對兩個源表進行純關系代數的乘運算。它不使用連接條件來限制結果集合,而是將分別來自兩個數據源中的行以所有可能的方式進行組合。數據集合中一的每個行都要與數據集合二中的每一個行分別組成一個新的行。例如,如果第一個數據源中有5個行,而第二個數據源中有4個行,那么在它們之間進行交叉連接就會產生20個行。人們將這種類型的結果集稱為笛卡爾乘積。
    大多數交叉連接都是由于錯誤操作而造成的;但是它們卻非常適合向數據庫中填充例子數據,或者預先創建一些空行以便為程序執行期間所要填充的數據保留空間。
    select *
    from  t_institution i
    cross join t_teller t
    在交叉連接中沒有on條件子句

    3 APPENDIX
    3.1 A 參考資料與資源
    ?        《Microsoft SQL Server 
    2000 Bile》Paul Nielsen
    ?        Paul Nielsen的Web站點
    [url]www.isnotnull.com[/url]
    3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1測試通過


    --

    表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
    (所影響的行數為 
    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并不以誰為基礎,它只顯示符合條件的記錄.


    -----------------[以下為網上的一點資料]------------------

    
    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 數據類型數據的字段,將會發生錯誤。
    posted on 2011-05-30 09:05 孤飛燕 閱讀(263) 評論(0)  編輯  收藏 所屬分類: 數據庫
    主站蜘蛛池模板: 日韩免费视频观看| 亚洲色无码一区二区三区| 无码天堂va亚洲va在线va| 亚洲中文字幕视频国产| 免费播放一区二区三区| 亚洲熟妇AV乱码在线观看| 亚洲性日韩精品一区二区三区| 国产精品免费福利久久| 亚洲视频无码高清在线| 国产成人亚洲精品狼色在线| 最近2019免费中文字幕6| 亚洲av第一网站久章草| 亚洲爆乳无码专区| 无码日韩精品一区二区免费| 人人爽人人爽人人片A免费| 亚洲一区二区电影| 免费大学生国产在线观看p| 久久综合九色综合97免费下载| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 国产免费伦精品一区二区三区| 久久精品国产亚洲AV高清热| 国产精品免费视频网站| 无码免费一区二区三区免费播放 | 人人玩人人添人人澡免费| 亚洲日韩国产二区无码| 亚洲AV无码一区二区三区系列| 成年女人18级毛片毛片免费观看| 99在线热播精品免费99热| 亚洲精品动漫免费二区| 亚洲国产日韩一区高清在线| 国产hs免费高清在线观看| 91精品国产免费久久久久久青草| xvideos永久免费入口| 亚洲精华国产精华精华液好用 | 免费看一级毛片在线观看精品视频| 亚洲美女色在线欧洲美女| 亚洲人精品午夜射精日韩| 国产精品视频免费一区二区三区| 亚洲一级免费视频| 中文字幕在线免费看| 免费一级全黄少妇性色生活片 |