圖解SQL inner join、left join、right join、full outer join、union、union all的區別

轉於:http://justcoding.iteye.com/blog/2006487

這是一篇來自Coding Horror的文章。

 

SQL的Join語法有很多:有inner的,有outer的,有left的,有時候,對於Select出來的結果集是什麼樣子有點不是很清楚。

 

假設我們有兩張表。Table A是左邊的表,Table B是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示:

A表
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
B表
id name
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

 

1、INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

結果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja

Inner join 產生的結果集是A和B的交集

Inner join產生的結果集是A和B的交集。

 
2、FULL [OUTER] JOIN

(1) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

結果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade

Full outer join 產生A和B的並集

Full outer join產生A和B的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做爲值。可以使用IFNULL判斷。

 

注意:

mysql 不支持全連接full join 的數據庫,可以用union 來代替:

1
2
3
select from hx_user LEFT JOIN hx_admin on hx_user.name = hx_admin.admin_name
UNION
SELECT from hx_user RIGHT JOIN hx_admin on hx_user.name = hx_admin.admin_name;

 

 

(2) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

結果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vade

產生A表和B表沒有交集的數據集

產生A表和B表沒有交集的數據集。

1
2
3
select from hx_user LEFT JOIN hx_admin on hx_user.name = hx_admin.admin_name where hx_user.name is NULL or hx_admin.admin_name is NULL
UNION
SELECT from hx_user RIGHT JOIN hx_admin on hx_user.name = hx_admin.admin_name where hx_user.name is NULL or hx_admin.admin_name is NULL

 

 

3、LEFT [OUTER] JOIN

(1) SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

結果集
(TableA.) (TableB.)
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null

eft outer join 產生表A的完全集,而B表中匹配的則有值

Left outer join產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。

 

(2) SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

結果集
(TableA.) (TableB.)
id name id name
2 Monkey null null
4 Spaghetti null null

產生在A表中有而在B表中沒有的集合

 

4、RIGHT [OUTER] JOIN

RIGHT OUTERJOIN是後面的表爲基礎,與LEFT OUTER JOIN用法類似。這裏不介紹了。

 

5、UNION  UNION ALL

UNION操作符用於合併兩個或多個SELECT語句的結果集。 請注意,UNION內部的SELECT語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條SELECT語句中的列的順序必須相同。 UNION只選取記錄,而UNION ALL會列出所有記錄。

 

(1) SELECT name FROM TableA UNION SELECT name FROM TableB

新結果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade

選取不同值

 

(2) SELECT name FROM TableA UNION ALL SELECT name FROM TableB

新結果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

全部列出來

 

(3) 注意:SELECT * FROM TableA UNION SELECT * FROM TableB

新結果集
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

由於id 1 Pirate與id 2 Pirate並不相同,不合並。

還需要註冊的是我們還有一個是“交差集”cross join,這種join沒有辦法用文式圖表示,因爲其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:SELECT * FROM TableA CROSS JOIN TableB,這個笛卡爾乘積會產生4 x 4 = 16條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對於性 能來說是非常危險的,尤其是表很大的時候。

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