關於sql joins的圖形解說 .
關於sql joins的圖形解說 .
原文:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
翻譯:
我喜歡這種查詢方式,現在讓我們來看看它是如何工作的。假設我們有如下的兩張表。表A在左邊,表B在右邊。我們將用下面的四條記錄進行互相的組裝查詢。
view plaincopyprint?01.id name id name
02.-- ---- -- ----
03.1
Pirate 1 Rutabaga
04.2 Monkey 2
Pirate
05.3
Ninja 3 Darth Vader
06.4 Spaghetti 4
Ninja id name id name
-- ---- -- ----
1
Pirate 1 Rutabaga
2 Monkey 2
Pirate
3
Ninja 3 Darth Vader
4 Spaghetti 4
Ninja 讓我們用不同的方式根據name這個欄位join這些表進行查詢,來看看是否我們能得出一個能夠和這些漂亮的圖解相吻合的結論。
view plaincopyprint?01.SELECT * FROM TableA 02.INNER JOIN TableB 03.ON TableA.name = TableB.name 04. 05.id name id name 06.-- ---- -- ---- 07.1 Pirate 2 Pirate 08.3 Ninja 4 Ninja SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja
Inner join 查詢得到的結果是匹配上表A和表B都相同的部分
view plaincopyprint?01.SELECT * FROM TableA 02.FULL OUTER JOIN TableB 03.ON TableA.name = TableB.name 04. 05.id name id name 06.-- ---- -- ---- 07.1 Pirate 2 Pirate 08.2 Monkey null null 09.3 Ninja 4 Ninja 10.4 Spaghetti null null 11.null null 1 Rutabaga 12.null null 3 Darth Vader SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
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 Vader
Full outer join 查詢的結果是表A和表B的所有記錄。,記錄含有兩邊都匹配的.如果沒有值相匹配的一邊將會用null來填充.
view plaincopyprint?01.SELECT * FROM TableA 02.LEFT OUTER JOIN TableB 03.ON TableA.name = TableB.name 04. 05.id name id name 06.-- ---- -- ---- 07.1 Pirate 2 Pirate 08.2 Monkey null null 09.3 Ninja 4 Ninja 10.4 Spaghetti null null SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
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來填充。
view plaincopyprint?01.SELECT * FROM TableA 02.LEFT OUTER JOIN TableB 03.ON TableA.name = TableB.name 04.WHERE TableB.id IS null 05. 06.id name id name 07.-- ---- -- ---- 08.2 Monkey null null 09.4 Spaghetti null null SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null
Left outer join produces a complete set of records from Table A, with the matching records (where available) in Table B. If there is no match, the right side will contain null.
view plaincopyprint?01.SELECT * FROM TableA 02.FULL OUTER JOIN TableB 03.ON TableA.name = TableB.name 04.WHERE TableA.id IS null 05.OR TableB.id IS null 06. 07.id name id name 08.-- ---- -- ---- 09.2 Monkey null null 10.4 Spaghetti null null 11.null null 1 Rutabaga 12.null null 3 Darth Vader SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader
Full outer join To produce the set of records unique to Table A and Table B, we perform the same full outer join, thenexclude the records we don't want from both sides via a where clause.
還有一個cross join查詢,這個就不用圖解了: view plaincopyprint?01.SELECT * FROM TableA 02.CROSS JOIN TableB SELECT * FROM TableA
CROSS JOIN TableB這種連接查詢是把每個記錄都查出來的並且疊加匹配,結果12行,很多原始數據集合。如果你做這種匹配查詢,你會發現為什麼對於查詢大數據時是一種危險的連接了。
《解決方案》
謝謝分享