在本文中,學習在 SQL 中連接表的基礎知識。 查看 Left、Right、Inner 和 Outer JOIN 以了解如何使用它們的示例。

RDBMS(關係數據庫管理系統)中的數據被分組到表中。這些表具有嚴格定義的可存儲數據類型。使用 JOIN 子句連接不同的表,連接可能相互關聯的不同類型的數據。

加盟類型

JOIN 有四種基本類型:INNER、OUTER、LEFT 和 RIGHT。 連接兩個表時,每個表都根據 ON 子句條件返回相應表的不同子集。

  • LEFT 和 RIGHT JOIN 執行類似的任務。兩者都返回一個表的全部內容,包括與第二個表相關的信息。
  • INNER JOIN 和 OUTER JOIN 執行非常不同的任務。 INNER JOIN 產生的結果非常有限,而 OUTER 返回完整的數據集。

注意:在撰寫本文時,MariaDB 和 MySQL 不支持 OUTER JOIN。但是,這是一個以不同方式產生此輸出的示例方法。

此示例使用本教程中的銷售部門示例,其中包含三個表:銷售人員、訂單和客戶。

salesperson 表包含三列:id、name 和佣金率。

銷售員表

然後,Orders 表包含四列:Order ID、Total Order Cost、Customer 和 Salesperson(如果有)。

採購訂單

客戶表包含兩列:id 和基本聯繫信息。

客戶表格 12-19客戶表

所以現在我們有多個信息表,以不同的方式幫助不同的人。我們將使用這三個表(銷售人員、訂單和客戶)來舉例說明每個 JOIN 如何提供幫助。

左連接

可能最常見的 JOIN 類型是 LEFT JOIN。在考慮要連接兩個表時,FROM 子句中指定的表位於左側。 JOIN 子句中提到的那個在右邊。 LEFT JOIN 將 LEFT(或 FROM)表中的每一行作為結果返回,並將其鏈接到 RIGHT(或 JOIN)表中與 ON 子句匹配的相應行。

請注意,左側的某些行可能沒有右側的匹配數據。在這種情況下,從生成的 RIGHT 表填充的字段將填充空值。

此外,如果 RIGHT 表中的多行與 LEFT 表中的行匹配,則結果集將包含多行。 顯示 LEFT JOIN 可視化的維恩圖:

離開加入 12-19左連接示例

營銷總監要求報告按客戶細分的所有訂單。您可以為此使用 LEFT JOIN。

SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

此查詢查詢鏈接到“客戶”表中的行的“訂單”表中的所有數據。其中客戶 ID 與 customer_id 的順序相同。結果如下所示:

訂單 2-12-19

請注意,對於 Widgets LLC 客戶,有 3 個訂單,因此有 3 個條目。 Jolly Inc. 下了兩份訂單,Acme Inc. 下了一份訂單。由於尚未下訂單,因此 Cheapo 未出現在此列表中。

加入權

RIGHT JOIN 與 LEFT JOIN 非常相似,只是它只返回 RIGHT (JOIN) 表的每一行和 LEFT (FROM) 表的相應行。同樣,如果 LEFT 表中沒有數據,這些列將填充 NULL 值。

如果 LEFT 表有多行,則結果集也將有多行。該維恩圖如下所示:

右加入12-19右連接示例

如果管理層要按客戶報告,即使客戶沒有訂購,也可以使用 RIGHT JOIN。

SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

從“訂單”表重新開始,並將其加入客戶表。 由於我們使用了 RIGHT JOIN,因此我們在 RIGHT (JOIN) 表中為每個條目 customer 至少獲得一行。 一旦 customer.id 和 orders.customer_id 匹配,輸入信息。結果包含在 order 列中具有 NULL 值的 Cheapo Co。

右連接 table-12-19

內部聯接

INNER JOIN 僅返回與 ON 子句匹配的每一列的行。如果右側沒有匹配項,則排除左側的行,反之亦然。 INNER JOIN 的維恩圖如下所示:

內連接 12-19INNER JOIN 示例

今天是發薪日,工資部門需要知道應支付的費用。為此,我們需要知道通過每個銷售人員下達的訂單。請注意,並非所有訂單都通過銷售代表。您可以為此使用 INNER JOIN。

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

從訂購單重新開始。這一次,加入銷售人員表。 如果 Orders 表中的條目與 Salespersons 表中的條目匹配,則會包含一行。這些行在結果中被忽略,不匹配的行用 NULL 值填充。

請注意,我們告訴數據庫返回計算的佣金以及銷售額和佣金率。結果如下所示:

外連接 0-12-19

外連接

無論是否匹配,外連接都會返回所有內容。 結合 LEFT JOIN 和 RIGHT JOIN 的結果會產生 OUTER JOIN。 OUTER JOIN 的維恩圖如下所示:

外連接 12-19使用 OUTER JOIN 的示例

現在是月底,銷售經理想知道所有銷售額和支付的所有佣金。為此使用 OUTER JOIN。

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

與工資單報告一樣,從訂單開始並加入銷售團隊。不同之處在於 OUTER JOIN 從 LEFT 和 RIGHT 表中獲取結果,如果沒有對應的匹配項,則用 NULL 填充。結果如下所示:

外連接 3-12-19

現在回想一下,我們說過 MariaDB 和 MySQL 不支持 OUTER JOIN。我還說過,將 LEFT JOIN 添加到 RIGHT JOIN 會給您一個 OUTER JOIN。這兩個系統的訣竅在於它們就是這樣做的。我們使用 UNION 子句來實現這一點。將一個查詢的結果附加到另一個。

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;

結果如下所示:

外連接 4-12-19

多個連接

JOIN 也可以用於連接兩個以上的表。如果您想要包含客戶和銷售人員信息的完整銷售報告,只需在最後再執行一次 JOIN。

SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

在此示例中,我們從 orders 表開始,並像以前一樣連接到 salespeople 表。下一步是將表連接到客戶表。這將填充可以鏈接到訂單的所有信息。

多連接-12-19

本文只是一個簡單的介紹,而不是詳盡的解釋如何在 SQL 中使用 JOIN。

單擊下面立即使用此方便的優惠券。

Liquid Web 擁有一些業內最強大的數據庫服務器。這些服務器可用於為企業級公司運行最小的家庭業務到最大的多數據庫集群。

致電 800.580.4985 或 和…聊天 或者聯繫我們經驗豐富的解決方案或託管顧問,了解如何利用這些技術。