1. 程式人生 > >Left join right join inner join outer join

Left join right join inner join outer join

 

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

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 產生的結果集中,是AB的交集。

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 產生AB的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做為值。

可以使用IFNULL判斷。

(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表沒有交集的資料集。

 

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

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

(2)

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.nameWHERE 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 OUTER JOIN 是後面的表為基礎,與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語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對於效能來說是非常危險的,尤其是表很大的時候。