數據庫: 左連接/右連接/全連接(詳細)

轉自:http://hi.baidu.com/xiaoqing2305/item/17cf9cd35d52cfe4b3f777c8

從兩個或更多個表中組合數據的過程稱爲連接表。數據庫管理從指定的表中形成行的所有組合。對於每個組合,它都測試連接條件。連接條件是帶有一些約束的搜索條件。有關約束的列表,

參考 SQL Reference。 
  

  注意:連接條件涉及的列的數據類型不必相同;然而,這些數據類型必須相容。計算連接條件的與計算其他搜索條件的方式相同,並且使用相同的比較規則。 
  
  如果未指定連接條件,則返回在 FROM 子句中列出的表中行的所有組合,即使這些行可能完全不相關。該結果稱爲這兩個表的交叉積。 
  
  本節中的示例基於下面兩個表。這兩個表只是樣本數據庫中表的簡化形式,在樣本數據庫中並不存在。這兩個表一般用來概述關於連接的重點。

 SAMP_STAFF 列出未作爲合同工僱用的僱員的姓名以及這些僱員的職務說明,而 SAMP_PROJECT 則列出僱員(合同工和全職人員)的姓名以及這些僱員所參與的項目。 
  
  這些表如下: 
  
  圖 5. SAMP_PROJECT 表
  
   sql入門:連接(圖一) 
  
  圖 6. SAMP_STAFF 表
  
   sql入門:連接(圖二) 
  
  下列示例產生兩個表的交叉積。因未指定連接條件,所以給出了行的所有組合: 
  
   SELECT SAMP_PROJECT.NAME,
      SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT, SAMP_STAFF
  
  此語句產生下列結果: 
  
   sql入門:連接(圖三) 
  
  兩個主要的連接類型是內連接和外連接。到目前爲止,所有示例中使用的都是內連接。內連接只保留交叉積中滿足連接條件的那些行。如果某行在一個表中存在,

但在另一個表中不存在,則結果表中不包括該信息。 
  
  下列示例產生兩個表的內連接。該內連接列出分配給某個項目的全職僱員信息: 
  
   SELECT SAMP_PROJECT.NAME,
      SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT, SAMP_STAFF
    WHERE SAMP_STAFF.NAME = SAMP_PROJECT.NAME
  
  或者,也可以指定如下內連接: 
  
   SELECT SAMP_PROJECT.NAME,
      SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT INNER JOIN SAMP_STAFF
     ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
  
  結果是: 
  
   sql入門:連接(圖四)
  
  注意:該內連接的結果由右表和左表中姓名列的值匹配的行組成- 'Haas' 和 'Thompson' 都包括在列出所有全職僱員的 SAMP_STAFF 表中以及列出分配給某個項目的專職和合同僱員的 SAMP_PROJECT 表中。 
  
  外連接是內連接和左表和/或右表中未包括內連接中的那些行的並置。當對兩個表執行外連接時,可任意將一個表指定爲左表而將另一個表指定爲右表。外連接有三種類型: 
  
  
  左外連接包括內連接和左表中未包括在內連接中的那些行。 
  
  右外連接包括內連接和右表中未包括在內連接中的那些行。 
  
  全外連接包括內連接以及左表和右表中未包括在內連接中的行。 
  使用 SELECT 語句來指定要顯示的列。在 FROM 子句中,列出後跟關鍵字 LEFT OUTER JOIN、RIGHT OUTER JOIN 或 FULL OUTER JOIN 的第一個表的名稱。

接着需要指定後跟 ON 關鍵字的第二個表。在 ON 關鍵字後面,指定表示要連接的表之間關係的連接條件。 
  
  在下列示例中,將 SAMP_STAFF 指定爲右表,而 SAMP_PROJECT 則被指定爲左表。通過使用 LEFT OUTER JOIN,列出所有全職和合同僱員(在 SAMP_PROJECT 中列出)的姓名和項目編號,

如果是全職僱員(在 SAMP_STAFF 中列出),還列出這些僱員的職位: 
  
   SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ,
      SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT LEFT OUTER JOIN SAMP_STAFF
     ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
  
  此語句產生下列結果:
  
   sql入門:連接(圖五) 
  
  所有列中都具有值的那些行是該內連接的結果。這些都是滿足連接條件的行: 'Haas' 和 'Thompson' 既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。

對於不滿足連接條件的行,右表的列上出現空值: 'Lutz' 和 'Walker' 都是在 SAMP_PROJECT 表中列出的合同僱員,因而未在 SAMP_STAFF 表中列出。

注意:左表中的所有行都包括在結果集中。 
  
  在下一個示例中,將 SAMP_STAFF 指定爲右表而 SAMP_PROJECT 則被指定爲左表。通過使用 RIGHT OUTER JOIN 列出所有專職僱員(在 SAMP_STAFF 中列出)的姓名和職位,

如果將這些僱員分配給了某個項目(在 SAMP_PROJECT 中列出),還列出他們的項目編號: 
  
   SELECT SAMP_PROJECT.NAME,
      SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT RIGHT OUTER JOIN SAMP_STAFF
     ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
  
  結果爲: 
  
   sql入門:連接(圖六) 
  
  象在左外連接中一樣,所有列中都具有值的那些行是內連接的結果。這些都是滿足連接條件的行: 'Haas'和'Thompson'既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。

對於不滿足連接條件的行,右表的列上出現空值: 'Lucchessi'和'Nicholls'都是未分配項目的專職僱員。

雖然他們在 SAMP_STAFF 中列出,但未在 SAMP_PROJECT 中列出。注意:右表中的所有行都包括在結果集中。 
  
  下一個示例對 SAMP_PROJECT 表和 SAMP_STAFF 表使用 FULL OUTER JOIN。該示例列出所有專職僱員(包括未分配項目的僱員)和合同僱員的姓名: 
  
   SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ,
      SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT FULL OUTER JOIN SAMP_STAFF
     ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
  
  結果爲:
  
  sql入門:連接(圖七) 
  
  此結果包括左外連接、右外連接以及內連接。列出所有專職僱員和合同僱員。正如左外連接和右外連接一樣,對於不滿足連接條件的值,相應列中出現空值。

 SAMP_STAFF 和 SAMP_PROJECT 中的每一行都包括在結果集中。

SQL語句實例:
(1) 右連接

     select * from ry_jbxx, ry_rxzp where ry_jbxx.gmsfhm(+) = ry_rxzp.gmsfhm

     等價

     select * from ry_jbxx right OUTER JOIN ry_rxzp on ry_jbxx.gmsfhm = ry_rxzp.gmsfhm

(2) 左連接

      select * from ry_jbxx, ry_rxzp where ry_jbxx.gmsfhm = ry_rxzp.gmsfhm(+)

      等價

     select * from ry_jbxx LEFT OUTER JOIN ry_rxzp on ry_jbxx.gmsfhm = ry_rxzp.gmsfhm



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章