一、前言
SQL JOIN是軟件開發者的必會知識點,這些JOIN有什么區別和聯系呢,本文來一一剖析。
要了解SQL,其實我們需要了解下關系代數。為什么這么說呢?
數據庫系統合并數據的原理其實是基于關系代數。SQL 語言是在關系代數上的一層封裝,目的是方便程序員使用。關系代數是 SQL 語言的基礎。
二、什么是關系代數
1、關系代數:
關系代數是由E.F.Codd于1970年提出的,它是合并數據集合的理論基礎。
關系代數的操作接受一個或多個關系作為輸入,再輸出一個新的關系,不同的關系操作可以進行相互的組合。例如可以先進行選擇操作再進行投影操作,先進行自然連接操作再進行選擇操作等等。根據不同的需求需要靈活的組合這些操作。
2、在關系代數的形式化語言中:
用表、或者數據集合表示關系或者實體。
用行表示元組。
用列表示屬性。
3、關系代數包含三大類運算符:
關系運算符 :選擇、投影、連接、除
集合運算符 :并、差、交、笛卡爾積
比較操作符:大于 小于 等于 與 或 非
比較操作符比較簡單就不介紹了,集合和關系運算符共8個,我們簡單說明:
? 選擇-返回滿足指定條件的行。select
? 投影-從數據集合中返回指定的列。
? 連接-在水平方向上合并兩個表,其方法是:將兩個表中在共同數據項上相互匹配的那些行合并起來。Join
? 除-返回兩個數據集之間的精確匹配。
? 并-關系的加法和減法,它可以在行的方向上合并兩個表中的數據,就像把一個表壘在另一個表之上一樣。
? 交-返回兩個數據集合所共有的行。
? 差-返回只屬于一個數據集合的行。
? 笛卡爾積-是關系的乘法,它將分別來自兩個數據集合中的行以所有可能的方式進行組合。
此外,作為一種實現現代關系代數運算的方法,SQL還提供了:
? 子查詢-類似于連接,但更靈活;在外部查詢中,可以使用表達式、列表或者數據集合的地方都可以使用子查詢的結果。
本文將主要講述多種類型的連接。
三、連接
3.1 什么是連接JOIN
JOIN子句合并兩個或多個表中的行。在臨時表中創建一組行。
3.2 連接類型
在關系代數中,連接運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個數據集合的乘運算,然后對生成的結果集合進行選取運算,確保只把分別來自兩個數據集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個數據集合(通常是表),并產生一個新的結果集合,其方法是將一個數據源中的行與另一個數據源中和它匹配的行組合成一個新元組。
SQL提供了多種類型的連接方式,它們之間的區別在于:從相互交疊的不同數據集合中選擇用于連接的行時所采用的方法不同。
連接類型 |
定義 |
自身連接 |
|
內連接 |
只連接匹配的行 |
左連接或左外連接 |
包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行 |
右連接或右外連接 |
包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行 |
全外連接 |
包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。 |
自然連接 |
其結構使得具有相同名稱的關聯表的列將僅出現一次 |
交叉連接 |
生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配
|
3.2.1 自身連接
自聯接是表與自身聯接(一元關系)的聯接,特別是當表具有引用其自身PRIMARY KEY的FOREIGN KEY時。例如人力資源數據庫中雇員與老板的關系。聯接表本身意味著表的每一行都與自身以及表的其他每一行結合在一起。自聯接可以看作是同一表的兩個副本的聯接。
例如:SELF JOIN
SELECT *
FROM table_A X,table_A Y
WHERE XA = YA;
3.2.2 內連接(Inner Join)
只要各列之間存在匹配,INNER JOIN就會從兩個參與表中選擇所有行。SQL INNER JOIN與JOIN子句相同(即inner可以省略),它組合了兩個或多個表中的行。
示例:INNER JOIN
SELECT * FROM table_A
INNER JOIN table_B
ON table_A.A = table_B.A;
3.2.3 左外連接(Left Outer Jion)
SQL LEFT JOIN連接兩個表,并根據條件獲取行,兩個表中的行均匹配。
JOIN子句之前的表中還將提供不匹配的行。
示例:LEFT JOIN或LEFT OUTER JOIN
SELECT * FROM table_A
LEFT JOIN table_B
ON table_A.A = table_B.A;
3.2.4 右外連接(Right Outer Jion)
SQL RIGHT JOIN連接兩個表,并根據條件獲取行,兩個表中的行均匹配。不匹配的行也可以從JOIN子句后面編寫的表中獲得。
示例:RIGHT JOIN或RIGHT OUTER JOIN
SELECT * FROM table_A
RIGHT JOIN table_B
ON table_A.A = table_B.A;
3.2.5 全外連接(Full Outer Join)
合并左右外部聯接的結果。返回所有匹配或不匹配的行。在join子句的兩邊都包含表。
說明:全外連接返回參與連接的兩個數據集合中的全部數據,無論它們是否具有與之相匹配的行。在功能上,它等價于對這兩個數據集合分別進行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個結果集合并為一個結果集。
在現實生活中,參照完整性約束可以減少對于全外連接的使用,一般情況下左外連接就足夠了。在數據庫中沒有利用清晰、規范的約束來防范錯誤數據情況下,全外連接就變得非常有用了,你可以使用它來清理數據庫中的數據。
示例:FULL OUTER JOIN
SELECT * FROM table_A
FULL OUTER JOIN table_B
ON table_A.A = table_B.A;
3.2.6 交叉(無限制) 連接(CROSS JOIN)
如果未與CROSS JOIN一起使用WHERE子句,則SQL CROSS JOIN會產生一個結果集,該結果集是第一個表中的行數乘以第二個表中的行數。這種結果稱為笛卡爾積。例如,如果第一個數據源中有5個行,而第二個數據源中有4個行,那么在它們之間進行交叉連接就會產生20個行。如果WHERE子句與CROSS JOIN一起使用,則其功能類似于INNER JOIN。
說明:大多數交叉連接都是由于錯誤操作而造成的;但是它們卻非常適合向數據庫中填充例子數據,或者預先創建一些空行以便為程序執行期間所要填充的數據保留空間。
示例:CROSS JOIN
SELECT *
FROM table_A
Cross join table_B;
3.2.7 自然連接(NATURAL JOIN)
SQL NATURAL JOIN是EQUI JOIN的一種,其結構使得具有相同名稱的關聯表的列將僅出現一次。關聯的表具有一對或多對相同名稱的列。這些列必須是相同的數據類型。不要在自然連接中使用ON子句。
示例:NATURAL JOIN
SELECT *
FROM table_A
NATURAL JOIN table_B;
四、小結
1、掌握SQL語言要掌握關系代數。關系代數的三類運算符:關系運算符、集合運算符、比較操作符。數據庫系統合并數據的原理其實是基于關系代數。SQL 語言是在關系代數上的一層封裝。
2、不同join之間的區別。