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

來源:互聯網
上載者:User

<http://blog.csdn.net/mangmang2012/article/details/8017034>

對於SQL的Join,在學習起來可能是比較亂的。我們知道,SQL的Join文法有很多inner的,有outer的,有left的,有時候,對於Select出來的結果集是什麼樣子有點不是很清楚。Coding Horror上有一篇文章,通過文氏圖 Venn diagrams 解釋了SQL的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 產生的結果集中,是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的並集。但是需要注意的是,對於沒有匹配的記錄,則會以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] JOINRIGHT OUTER  JOIN 是後面的表為基礎,與LEFT OUTER JOIN用法類似。這裡不介紹了。 5.UNION  UNION ALLUNION 操作符用於合并兩個或多個 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語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對於效能來說是非常危險的,尤其是表很大的時候。
http://blog.diyiye.com/?post=10

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.