SQL中的left outer join,inner join,right 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可以省略。

查詢的結果是表t_institution 裏面的數據全部取出來,而不管t_teller 的連接條件是否滿足。


2.3.2          右外連接(Rigt Outer Jion)
select *
from    t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no

查詢的結果是表t_institution 裏面,滿足的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條件子句

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