SQL語句的並集UNION,交集JOIN(內連接,外連接),交叉連接(CROSS JOIN笛卡爾積),差集(NOT IN)

1.
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. 笛卡爾積
SELECT * FROM table1 CROSS JOIN table2

SELECT * FROM table1,table2相同


2. SQL中的UNION
UNION與UNION ALL的區別是,前者會去除重複的條目,後者會仍舊保留。

a. UNION
SQL Statement1
UNION
SQL Statement2

b. UNION ALL
SQL Statement1
UNION ALL
SQL Statement2

3. 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
-- 自然連接(會去除重複的列)


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
 

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