1. 程式人生 > 實用技巧 >mysql基礎知識——JOIN關聯

mysql基礎知識——JOIN關聯

作者:丶平凡世界

來源:SQL資料庫開發

JOIN連線的作用

JOIN 連線用於把來自兩個或多個表的行結合起來,基於這些表之間的共同欄位。

最常見的 JOIN 型別:INNER JOIN(簡單的 JOIN)。INNER JOIN 從多個表中返回滿足 JOIN 條件的所有行。

注意:連線不是物理實體,它在資料庫的物理表中是不存在的,只有當MySQL需要使用連線來進行查詢時才會使用到。

示例資料庫

讓我們看看選自 "Orders" 表的資料:

然後,看看選自 "Customers" 表的資料:

請注意,"Orders" 表中的 "客戶ID" 列指向 "Customers" 表中的"客戶ID"。上面這兩個表是通過 "客戶ID" 列聯絡起來的。

JOIN例項

我們想知道每個訂單ID都是哪些客戶訂購的,以及具體的訂單時間。我們執行下面的 SQL 語句(包含 INNER JOIN):

SELECTo.訂單ID, c.姓名, o.訂單日期
FROMOrders o
INNERJOINCustomers c
ONo.客戶ID=c.客戶ID;

執行結果如下所示:

不同的 JOIN

在我們繼續講解例項之前,我們先列出您可以使用的不同的 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 語法

SELECTcolumn_name(s)
FROMtable1
LEFT JOINtable2
ONtable1.column_name=table2.column_name;

或:

SELECTcolumn_name(s)
FROMtable1
LEFT OUTER JOINtable2
ONtable1.column_name=table2.column_name;

註釋:在一些資料庫中,LEFT JOIN稱為LEFT OUTER JOIN。

LEFT JOIN示例

我們想看看客戶Customers表中的所有使用者是否都有下單,可以使用如下查詢語言:

SELECTc.姓名,o.訂單ID, o.訂單日期
FROMCustomers c
LEFTJOINOrders o
ONo.客戶ID=c.客戶ID;

結果:

我們發現劉二,李四,趙七沒有對應的訂單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;

註釋:在一些資料庫中,RIGHT JOIN 稱為 RIGHT OUTER JOIN。

右連線與左連線的主表剛好相反,會將table2中的資料完全顯示,如果table1中沒有匹配上的就不顯示。

FULL OUTER JOIN

當左(表1)或右(表2)表記錄匹配時,FULL 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也可以進行連線。

例如:要查詢每個客戶的訂單數量,我們可以這樣寫

SELECT
`姓名`,
`客戶ID`,
(
SELECTCOUNT(*)
FROMorders o
WHEREo.`客戶ID`=c.`客戶ID`
)AS'數量'
FROMcustomers c

結果為:

這裡使用SELECT COUNT(*)對錶中的行進行計數,並且通過提供一條WHERE子句的連線來匹配某個特定的客戶ID 。