介紹
這是一篇闡述SQL JOINs的文章。
背景
我是個不喜歡抽象的人,一圖勝千言。我在網上查找了所有的關於SQL JOIN的解釋,但是沒有找到一篇能用圖像形象描述的。
有些是有圖片的但是他們沒有覆蓋所有JOIN的例子,有些介紹實在簡單空白得不能看。所以我決定寫個自己的文章來介紹SQL JOINs.
詳細說明
接下來我將討論七種你可以從兩個關聯表中獲取數據的方法, 排除了交叉JOIN和自JOIN的情況。 七個JOINs的例子如下:
- INNER JOIN (內連接)
- LEFT JOIN (左連接)
- RIGHT JOIN (右連接)
- OUTER JOIN (外連接)
- LEFT JOIN EXCLUDING INNER JOIN (左連接排除內連接結果)
- RIGHT JOIN EXCLUDING INNER JOIN (右連接排除內連接結果)
- OUTER JOIN EXCLUDING INNER JOIN (外連接排除內連接結果)
為了這個文章更好的描述,我把5,6,7當作LEFT EXCLUDING INNER JOIN, RIGHT EXCLUDING INNER JOIN,OUTER EXCLUDING INNER JOIN來特別說明。
有些人可能有不同意見: 5,6,7不是真正的兩個表的JOIN; 但是為了方便理解,我仍然把這些作為JOINs, 因為你有可能會在每個查詢中使用到這些 JOIN (排除一些有WHERE條件的記錄)。
INNER JOIN (內連接)
這是最簡單、最容易理解、最常用的JOIN方式。 內連接查詢返回表A和表B中所有匹配行的結果。 SQL樣例如下:
SELECT <select_list> FROM Table_A A INNER JOIN Table_B B ON A.Key = B.Key
LEFT JOIN (左連接)
LFET JOIN查詢返回所有表A中的記錄, 不管是否有匹配記錄在表B中。它會返回所有表B中的匹配記錄 (沒有匹配的當然會標記成null了)。 SQL樣例如下:
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key
RIGHT JOIN (右連接)
和LEFT JOIN相反。 RIGHT JOIN查詢會返回所有表B中的記錄,不管是否有匹配記錄在表A中。它會返回所有表A中的匹配記錄(沒有匹配的當然會標記成null了)。 SQL樣例如下:
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key
OUTER JOIN (外連接)
OUTER JOIN也可以當作是FULL OUTER JOIN 或者FULL JOIN。它會返回兩個表中所有行,左表A匹配右表B,右表B也匹配左表A (沒有匹配的就顯示null了)。
OUTER JOIN一般寫成下面樣子:
SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key
LEFT Excluding JOIN
它會返回表A中所有不在表B中的行,一般寫成:
SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key WHERE B.Key IS NULL
RIGHT Excluding JOIN
與上面的相反,它會返回表B中所有不在表A中的行,SQL樣例如下:
SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL
OUTER Excluding JOIN
Outer Excluding JOIN 會返回所有表A和表B中沒有匹配的行。我還沒有遇到要用到這種情況的,但是其他的JOIN,用的比較頻繁。 SQL樣例如下:
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
例子
假設我們有兩個表:表A和表B。表中數據如下所示:
TABLE_A PK Value ---- ---------- 1 FOX 2 COP 3 TAXI 6 WASHINGTON 7 DELL 5 ARIZONA 4 LINCOLN 10 LUCENT
TABLE_B PK Value ---- ---------- 1 TROT 2 CAR 3 CAB 6 MONUMENT 7 PC 8 MICROSOFT 9 APPLE 11 SCOTCH
這七個JOIN的結果分別如下:
-- INNER JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A INNER JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 6 WASHINGTON MONUMENT 6 7 DELL PC 7 (5 row(s) affected)
-- LEFT JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A LEFT JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 4 LINCOLN NULL NULL 5 ARIZONA NULL NULL 6 WASHINGTON MONUMENT 6 7 DELL PC 7 10 LUCENT NULL NULL (8 row(s) affected)
-- RIGHT JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A RIGHT JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 6 WASHINGTON MONUMENT 6 7 DELL PC 7 NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 (8 row(s) affected)
-- OUTER JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A FULL OUTER JOIN Table_B B ON A.PK = B.PK A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 1 FOX TROT 1 2 COP CAR 2 3 TAXI CAB 3 6 WASHINGTON MONUMENT 6 7 DELL PC 7 NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 5 ARIZONA NULL NULL 4 LINCOLN NULL NULL 10 LUCENT NULL NULL (11 row(s) affected)
注意:OUTER JOIN中,inner join的行會先返回,接着是右連接了的行,最后是左連接了的行。 (至少 Microsoft SQL Server是這樣的; 前提是所有的join都沒有使用order by排序過)
-- LEFT EXCLUDING JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A LEFT JOIN Table_B B ON A.PK = B.PK WHERE B.PK IS NULL A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- 4 LINCOLN NULL NULL 5 ARIZONA NULL NULL 10 LUCENT NULL NULL (3 row(s) affected)
-- RIGHT EXCLUDING JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A RIGHT JOIN Table_B B ON A.PK = B.PK WHERE A.PK IS NULL A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 (3 row(s) affected)
-- OUTER EXCLUDING JOIN SELECT A.PK AS A_PK, A.Value AS A_Value, B.Value AS B_Value, B.PK AS B_PK FROM Table_A A FULL OUTER JOIN Table_B B ON A.PK = B.PK WHERE A.PK IS NULL OR B.PK IS NULL A_PK A_Value B_Value B_PK ---- ---------- ---------- ---- NULL NULL MICROSOFT 8 NULL NULL APPLE 9 NULL NULL SCOTCH 11 5 ARIZONA NULL NULL 4 LINCOLN NULL NULL 10 LUCENT NULL NULL (6 row(s) affected)
你可以參考Wikipedia以查閱更多信息: http://en.wikipedia.org/wiki/Sql_join
我創建了一個簡化總結圖表(如下),經常用到SQL的話,可以打印下來以作參考。 右擊下載圖片就行了...
版權
本文翻譯自:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
這篇文章和相關的代碼及圖片采用的授權是:The Code Project Open License (CPOL)
譯者說明, 轉載請注明出處:http://www.cnblogs.com/xufeiyang/p/5818571.html