在本文中,您將學習在 SQL 中連接表的基礎知識。查看左側、右側、內部和外部 JOIN 以查看如何使用它們的示例。

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

參與類型

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

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

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

此示例使用本教程中的銷售部門示例並使用三個表:salesperson、order 和 customer。

銷售代表表包含三列:ID、名稱和佣金率。

銷售代表表

然後,訂單表包含四列:訂單 ID、訂單總成本、客戶和銷售代表(如果有)。

採購訂單

客戶表包含兩列: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 未出現在此列表中。

正確參與

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

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

權利參與 12-19右連接示例

如果管理層要向每個客戶報告,可以使用 RIGHT JOIN 而不需要客戶訂購。

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

從“訂單”表開始並加入客戶表。 因為我們使用了 RIGHT JOIN,所以我們為 RIGHT (JOIN) 表中的每個條目獲得至少一行。 如果 customer.id 和 orders.customer_id 匹配,請輸入信息。結果包含在 order 列中具有 null 值的 CheapoCo:

右連接 Table-12-19

內部聯接

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

內連接12-19內部連接示例

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

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

從訂購單重新開始。這次我將參加銷售代表的餐桌。 如果 Orders 表中的條目與 Salespersons 表中的條目匹配,則包括該行。不是用空值填充不匹配的行,而是在結果中忽略這些行。

請注意,我們指示數據庫不僅返回銷售和佣金率,還返回計算的佣金。結果如下:

外連接 0-12-19

外連接

外連接返回所有內容,無論它們是否匹配。 結合 LEFT 和 RIGHT JOIN 的結果得到 OUTER JOIN。 OUTERJOIN的維恩圖如下。

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

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

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。他還說,將左鍵添加到右鍵會產生外部鍵。這兩個系統的秘訣就是做到這一點。使用 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;

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

多連接-12-19

本文是一個簡單的介紹,並不是對如何在 SQL 中使用 JOIN 的完整解釋。

點擊下方立即使用這個方便的優惠券!

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

請致電 800.580.4985 或 聊天 或與我們經驗豐富的解決方案之一或託管顧問交談,了解當今如何利用這些技術。