[譯文] SQL JOIN,你想知道的應該都有


介紹

這是一篇闡述SQL JOINs的文章。

背景

我是個不喜歡抽象的人,一圖勝千言。我在網上查找了所有的關於SQL JOIN的解釋,但是沒有找到一篇能用圖像形象描述的。

有些是有圖片的但是他們沒有覆蓋所有JOIN的例子,有些介紹實在簡單空白得不能看。所以我決定寫個自己的文章來介紹SQL JOINs.

詳細說明

接下來我將討論七種你可以從兩個關聯表中獲取數據的方法, 排除了交叉JOIN和自JOIN的情況。 七個JOINs的例子如下:

  1. INNER JOIN (內連接)
  2. LEFT JOIN (左連接)
  3. RIGHT JOIN (右連接)
  4. OUTER JOIN (外連接)
  5. LEFT JOIN EXCLUDING INNER JOIN (左連接排除內連接結果)
  6. RIGHT JOIN EXCLUDING INNER JOIN (右連接排除內連接結果)
  7. 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 (內連接)

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 (左連接)

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 (右連接)

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

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

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

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
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的話,可以打印下來以作參考。 右擊下載圖片就行了...
SQL JOINs

版權

本文翻譯自: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM