本文來自網絡,自己整理了一下,如下文:
-
連接大致分類如下:
-
內連接(INNER JOIN):
分爲三種:等值連接、自然連接、不等連接
-
外連接(OUTER JOIN):
分爲三種:
左外連接(LEFT OUTER JOIN或LEFT JOIN)
右外連接(RIGHT OUTER JOIN或RIGHT JOIN)
全外連接(FULL OUTER JOIN或FULL 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