MySQL基礎知識——JOIN關聯(lián)
點擊關注上方“SQL數(shù)據庫開發(fā)”,
設為“置頂或星標”,第一時間送達干貨
JOIN連接的作用
JOIN 連接用于把來自兩個或多個表的行結合起來,基于這些表之間的共同字段。
最常見的 JOIN 類型:INNER JOIN(簡單的 JOIN)。INNER JOIN 從多個表中返回滿足 JOIN 條件的所有行。
注意:連接不是物理實體,它在數(shù)據庫的物理表中是不存在的,只有當MySQL需要使用連接來進行查詢時才會使用到。
示例數(shù)據庫
讓我們看看選自 "Orders" 表的數(shù)據:

然后,看看選自 "Customers" 表的數(shù)據:

請注意,"Orders" 表中的 "客戶ID" 列指向 "Customers" 表中的"客戶ID"。上面這兩個表是通過 "客戶ID" 列聯(lián)系起來的。
JOIN實例
我們想知道每個訂單ID都是哪些客戶訂購的,以及具體的訂單時間。我們運行下面的 SQL 語句(包含 INNER JOIN):
SELECT o.訂單ID, c.姓名, o.訂單日期
FROM Orders o
INNER JOIN Customers c
ON o.客戶ID=c.客戶ID;運行結果如下所示:

不同的 JOIN
在我們繼續(xù)講解實例之前,我們先列出您可以使用的不同的 SQL JOIN 類型:
INNER JOIN:如果表中有至少一個匹配,則返回行
LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN:只要其中一個表中存在匹配,則返回行
INNER JOIN
內部鏈接INNER JOIN關鍵字選擇兩個表中具有匹配值的記錄。
SQL INNER JOIN 語法
SELECT column_name(s)FROM table1
INNER JOIN table2 ON
table1.column_name = table2.column_name;
注釋:INNER JOIN 與 JOIN 是相同的,上面的示例就是INNER JOIN

LEFT JOIN
SQL左鏈接LEFT JOIN關鍵字返回左表(表1)中的所有行,即使在右表(表2)中沒有匹配。如果在正確的表中沒有匹配,結果是NULL。
SQL LEFT JOIN 語法
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注釋:在一些數(shù)據庫中,LEFT JOIN稱為LEFT OUTER JOIN。

LEFT JOIN示例
我們想看看客戶Customers表中的所有用戶是否都有下單,可以使用如下查詢語言:
SELECT c.姓名,o.訂單ID, ?o.訂單日期
FROM Customers c
LEFT JOIN Orders o
ON o.客戶ID=c.客戶ID;結果:

我們發(fā)現(xiàn)劉二,李四,趙七沒有對應的訂單ID和訂單日期,是因為他們沒有在訂單表Orders中存在,沒有匹配上他們的信息。但是由于是左連接,就把主表Customers的信息全部顯示出來了,就是對應上圖的table1。
RIGHT JOIN
SQL右鏈接 RIGHT JOIN 關鍵字返回右表(table2)的所有行,即使在左表(table1)上沒有匹配。如果左表沒有匹配,則結果為NULL。
SQL RIGHT JOIN 語法
SELECT column_name(s) FROM table1
RIGHT JOIN table2 ON
table1.column_name = table2.column_name;
注釋:在一些數(shù)據庫中,RIGHT JOIN 稱為 RIGHT OUTER JOIN。

右連接與左連接的主表剛好相反,會將table2中的數(shù)據完全顯示,如果table1中沒有匹配上的就不顯示。
?FULL OUTER JOIN
當左(表1)或右(表2)表記錄匹配時,F(xiàn)ULL OUTER JOIN關鍵字將返回所有記錄。
注意:?FULL OUTER JOIN可能會返回非常大的結果集!
SQL FULL OUTER JOIN 語法
SELECT column_name(s) FROM table1
FULL OUTER JOIN table2 ON
table1.column_name = table2.column_name;

全連接就是將table1和table2的內容完全顯示,不管有沒有匹配上。
WHERE連接
除了上面的JOIN連接,我們在上一個子查詢中其實有講解到使用WHERE也可以進行連接。
例如:要查詢每個客戶的訂單數(shù)量,我們可以這樣寫
SELECT?
`姓名`,
`客戶ID`,
(
SELECT?COUNT(*)
FROM?orders o
WHERE?o.`客戶ID`=c.`客戶ID`?
) AS?'數(shù)量'
FROM?customers c結果為:

這里使用SELECT COUNT(*)對表中的行進行計數(shù),并且通過提供一條WHERE子句的連接來匹配某個特定的客戶ID 。
——End——
后臺回復關鍵字:1024,獲取一份精心整理的技術干貨 后臺回復關鍵字:進群,帶你進入高手如云的交流群。 推薦閱讀
手機沒網了,卻還能支付,這是什么原理? 為什么阿里巴巴禁止使用存儲過程? 一份非常完整的 MySQL 規(guī)范,速速收藏! 數(shù)據庫中為什么不推薦使用外鍵約束 阿里規(guī)定超過3張表,禁止JOIN,為何?
這是一個能學到技術的公眾號,歡迎關注
點擊「閱讀原文」了解SQL訓練營
