[轉載] 數據庫中的內連接與外連接普及

本文來自網絡,自己整理了一下,如下文:


  • 連接大致分類如下:

  

  1. 內連接(INNER JOIN):  

     分爲三種:等值連接、自然連接、不等連接  

 
  1. 外連接(OUTER JOIN):  

     分爲三種:  

     左外連接(LEFT OUTER JOINLEFT JOIN)  

     右外連接(RIGHT OUTER JOINRIGHT JOIN)  

     全外連接(FULL OUTER JOINFULL JOIN)  

            交叉連接(CROSS JOIN):  

          沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積


一)

a. 並集UNION :

SELECT column1, column2 
FROM  table1 UNION SELECT column1, column2 FROM table2

b. 交集JOIN :

SELECT * FROM table1 AS a JOIN 
table2 b ON a.name=b.name

c. 差集NOT IN :

SELECT * FROM table1 WHERE name 
NOT IN(SELECT name FROM table2)

d. 笛卡爾積CROSS JOIN :

SELECT * FROM table1 
CROSS JOIN table2 

(   與 SELECT * FROM 

table1,table2相同)

二)

SQL中的UNION UNION ALL的區別是,前者會去除重複

的條目,後者會仍舊保留。

a. UNION SQL Statement1 UNION SQL Statement2

b. UNION ALL: SQL Statement1 UNION ALL SQL 

Statement2

三)

SQL中的各種JOIN, SQL中的連接可以分爲內連接,外

連接,以及交叉連接(即是笛卡爾積)

a. 交叉連接 CROSS JOIN:

如果不帶WHERE條件子句,它將會返回被連接的兩個表

的笛卡爾積,返回結果的行數等於兩個錶行數的乘積; 

舉例

SELECT * FROM table1 CROSS JOIN table2

 等同於

SELECT * FROM table1,table2

一般不建議使用該方法,因爲如果有WHERE子句的話,

往往會先生成兩個錶行數乘積的行的數據表然後才根據

WHERE條件從中選擇。 因此,如果兩個需要求交際的表

太大,將會非常非常慢,不建議使用。

b. 內連接 INNER JOIN :

如果僅僅使用 

SELECT * FROM table1 INNER JOIN 

table2 沒有指定連接條件的話,和交叉連接的結果一

樣。 但是通常情況下,使用INNER JOIN需要指定連接

條件。

-- 等值連接(=號應用於連接條件不會去除重複的列

SELECT * FROM table1 AS a INNER JOIN table2 AS b 
on a.column=b.column

-- 不等連接(>,>=,<,<=,!>,!<,<>) 例如 SELECT * 

FROM table1 AS a INNER JOIN table2 AS b on 
a.column<>b.column

-- 自然連接(會去除重複的列)

等值連接與自然連接的區別:

1. 等值連接中不要求相等屬性值的屬性名相同,而自然連接要求相等屬性值的屬性名必須相同,即兩關係只有在同名屬性才能進行自然連接。

2. 等值連接不將重複屬性去掉,而自然連接去掉重複屬性,也可以說,自然連接是去掉重複列的等值連接。

c. 外連接 OUTER JOIN:

  首先內連接和外連接的不同之處: 內連接如果沒有指定連接條件的話,和笛卡爾積的交叉連接結果一樣,但是不同於笛卡爾積的地方是,沒有笛卡爾積那麼複雜地要先生成行數乘積的數據表,內連接的效率要高於笛卡爾積的交叉連接。 指定條件的內連接,僅僅返回符合連接條件的條目。

外連接則不同,返回的結果不僅包含符合連接條件的行,而且包括左表(左外連接時), 右表(右連接時)或者兩邊連接(全外連接時)的所有數據行 

1)左外連接LEFT [OUTER] JOIN 

顯 示符合條件的數據行,同時顯示左邊數據表不符合

條件的數據行,右邊沒有對應的條目顯示NULL 例如 

SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON 

a.column=b.column                                

         

2)右外連接RIGHT [OUTER] JOIN

 顯 示符合條件的數據行,同時顯示右邊數據表不符合

條件的數據行,左邊沒有對應的條目顯示NULL 例如 

SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON 

a.column=b.column                                

                          

3)全外連接:

顯示符合條件的數據行,同時顯示左右不符合條件的數

據行,相應的左右兩邊顯示NULL







發佈了25 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章