回答
內部連接不會在連接目標字段中帶來任何空值。如果沒有匹配的記錄,則原件不在表格中。
即使在另一個表中沒有匹配的行,完全連接也會從兩個表中返回行。完全連接就像一個正確的連接和一個左連接。內部聯接將只返回在另一個表中至少有一個夥伴的行。
這意味着您的表格匹配得相當好。
維基頁面找到here顯示了他們如何工作的一個很好的例子。
A FULL OUTER JOIN
是LEFT OUTER JOIN
和RIGHT OUTER JOIN
的聯合。
(?這樣做是否有意義)
描述不錯的視覺解釋聯接(左下介紹全外連接):
參考:codeproject
引用源代碼?看起來像http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins – 2014-06-18 02:39:48
它已經有一段時間了,它可能是你引用的codeproject。 – 2014-06-19 11:39:42
好的,我檢查過了,它是M.L Moffat的博客帖子,我必須找到它。 – 2015-08-20 14:40:59
所不同的是無與倫比的行爲行。
例如,如果表A中有一行在定義了連接的字段中的表B中沒有對應關係,那麼內部聯接將完全省略該行,而完全聯接將包含該行,但對於表B的字段具有NULL值。Viceversa對於不匹配的表B行。
考慮表A和表B
表A - (密鑰,名稱)
1,數據1 2,數據2 4,數據4 5,DATA5
表B - (鍵,的Fkey,名稱)
1,1,DataA的 2,2,數據B 3,NULL,DATAC 4,4,DataD
內連接將返回
- 1,數據1,1,1,DataA的
- 2,數據2,2,2,數據B
- 4,數據3,4,4,DataD
而一個完全外部聯接將返回
- 1,數據1,1,1,DataA的
- 2,數據2,2,2,數據B
- NULL,NULL,3,NULL,DATAC
- 4,數據4,4,4,DataD
- 5,DATA5,NULL,NULL,NULL
注意所有這些可以在維基百科找到:Join (SQL)。
有三種類型的外部聯接:
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
關鍵字OUTER是在下面的所有實現可選標準,所以FULL JOIN與FULL OUTER JOIN相同。 (我在這個答覆的其餘部分中刪除了來自SQL的OUTER
。)
讓我們來看看它們各自的作用。
考慮以下兩個輸入數據集:
Set "A" Set "B"
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6
注意,有所述的一些項目不在B,反之亦然。
現在,如果我們這樣寫的SQL語句,使用LEFT JOIN:
SELECT * FROM A LEFT JOIN B ON AA = BB
你會得到以下結果(空孔實際上NULL
馬克):
AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4
注意你會得到所有的來自AA的行,或者更確切地說,全部是來自的行左邊的連接子句的一部分。
如果您切換到使用右連接:您從連接語句的右側部分中的所有行獲得
SELECT * FROM A RIGHT JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
通知。
但是,如果你想兩者都行,你會使用完全聯接:
SELECT * FROM A FULL JOIN B ON AA = BB
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL's
Item 6 |
^ |
| |
+---------------------+
正如評論所說,讓我完成了其他不同的方式加入。
隨着內部聯接:
SELECT * FROM A INNER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
有內加入我們只得到實際匹配的行,沒有因爲加入的孔。
交叉連接生成笛卡爾積,通過從第一組的每一行從第二組匹配了每一行:
SELECT * FROM A CROSS JOIN B
AA BB
-------- --------
Item 1 Item 3 ^
Item 1 Item 4 +--- first item from A, repeated for all items of B
Item 1 Item 5 |
Item 1 Item 6 v
Item 2 Item 3 ^
Item 2 Item 4 +--- second item from A, repeated for all items of B
Item 2 Item 5 |
Item 2 Item 6 v
Item 3 Item 3 ... and so on
Item 3 Item 4
Item 3 Item 5
Item 3 Item 6
Item 4 Item 3
Item 4 Item 4
Item 4 Item 5
Item 4 Item 6
還要注意的是,我們沒有指定匹配的列,因爲沒有匹配完成。
最後,NATURAL連接,在這種語法中,我們不指定哪些列匹配,但匹配列名。在我們人爲的例子,沒有列名是相同的,但是我們要說的這個具體的例子,列名是XX兩個表中,那麼我們將得到以下結果:
SELECT * FROM A NATURAL JOIN B
+----------+------- matches on the names, and then the data
| |
v v
XX XX
-------- --------
Item 3 Item 3
Item 4 Item 4
正如你所看到的,你與INNER連接相同,但不必輸入連接子句的匹配部分。
在一個非常簡單的方式,主要區別是:
INNER JOIN - 只返回匹配的行。因此,不包括不匹配的行。
FULL JOIN - 返回存在於右表,而不是在左側存在於左表而不是在正確的行,加行,越過內加入行。
- 1. 加入之間的區別
- 2. MySQL區別內部加入
- 3. Inner Join VS內部遠程加入之間的區別
- 4. 內核加載地址和入口點之間的區別
- 5. Rails查詢]加入之間的區別
- 6. 嵌入式系統內部,內聯,外部之間的區別?
- 7. 加入條件和加入子查詢之間的區別(過濾器)
- 8. 加入的條件和條件之間的區別
- 9. MySQL內部加入兩個表之間
- 10. 加入和在哪裏之間的區別
- 11. 多線程加入和等待之間的區別,通知
- 12. MySQL加入和區別
- 13. SQL部分完全外部加入
- 14. 按鈕和輸入之間的區別?
- 15. 投入和MESSAGE之間的區別?
- 16. 此WHERE子句和此加入之間有什麼區別?
- 17. MySQL內部加入內部加入?
- 18. 左和內部加入區別...一次永久
- 19. 加密和散列之間的區別
- 20. svyglm和加權glm之間的區別
- 21. MD4和MD5加密之間的區別
- 22. 添加舍入和非舍入double值與日期之間的區別?
- 23. 添加內部和外部事件偵聽器之間的區別(AS3)
- 24. 函數內導入python庫與全局導入之間的區別?
- 25. 「命名空間」內部或外部的「使用」(導入)之間的區別?
- 26. 高級內部用戶之間的加入,USER_GROUP和訂閱表
- 27. 完全外部自我加入
- 28. 複雜完全外部加入
- 29. SQL完全外部加入W /合併
- 30. 完全外部加入怎麼辦
當沒有匹配時,外部連接返回空值 – 2010-06-11 12:53:25