SQL 交叉連線 (CROSS JOIN)

摘要:在本教程中,您將學習如何使用 SQL CROSS JOIN 子句將第一個表中的每一行與第二個表中的每一行進行組合。

SQL CROSS JOIN 子句簡介 #

CROSS JOIN 子句是 SELECT 語句的一個可選子句。CROSS JOIN 子句允許您建立來自兩個表的所有行的組合。

以下是 CROSS JOIN 子句的語法:

SELECT
  select_list
FROM
  table1
  CROSS JOIN table2;Code language: SQL (Structured Query Language) (sql)

在此語法中:

  • 首先,在 FROM 子句中提供第一個表。
  • 其次,在 CROSS JOIN 子句中指定您想要與第一個表合併行的第二個表。

left join、right join、inner joinfull join 不同,cross join 沒有條件。

CROSS JOIN 子句將第一個表 (table1) 中的每一行與第二個表 (table2) 中的每一行合併。它返回一個包含兩個表中所有行的可能組合的結果集。

CROSS JOIN 的結果集通常被稱為兩個表的笛卡爾積

如果 table1n 行,table2m 行,那麼 CROSS JOIN 將返回一個包含 n * m 行的結果集。

例如,如果 table1 有兩行,table2 有三行,那麼這兩個表的交叉連線結果將有 6 行 (2 * 3)。

或者,您也可以透過在 SELECT 語句的 FROM 子句中列出表來執行交叉連線,如下所示:

SELECT
  select_list
FROM
  table1,
  table2;Code language: SQL (Structured Query Language) (sql)

理解交叉連線 #

假設您有兩個表:

  • X 表有兩個列:id (鍵) 和 x
  • Y 表也有兩個列:id (鍵) 和 y
y table - cross join

交叉連線將左表 (X) 的每一行與右表 (Y) 的每一行組合起來,以建立最終的結果集:

sql cross join visualization

下圖是說明交叉連線的另一種方式:

sql cross join diagram

SQL CROSS JOIN 子句示例 #

首先,建立一個名為 trainings 的新表來儲存培訓專案:

CREATE TABLE trainings (
  id INT PRIMARY KEY,
  program_name VARCHAR(255) NOT NULL,
  duration INT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

試一試

其次,向 trainings 表中插入一些行

INSERT INTO
  trainings (id, program_name, duration)
VALUES
  (1, 'Leadership Skills', 1),
  (2, 'Communication Skills', 2);Code language: SQL (Structured Query Language) (sql)

試一試

第三,使用 CROSS JOIN 子句生成員工和培訓專案的所有可能組合:

SELECT
  first_name,
  program_name
FROM
  employees
  CROSS JOIN trainings
ORDER BY
  first_name;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name  |     program_name
-------------+----------------------
 Adam        | Communication Skills
 Adam        | Leadership Skills
 Alexander   | Leadership Skills
 Alexander   | Communication Skills
 Alexander   | Communication Skills
 Alexander   | Leadership Skills
 Britney     | Communication Skills
 Britney     | Leadership Skills
...Code language: plaintext (plaintext)

以下查詢執行與上例相同的 CROSS JOIN 子句,但使用了替代語法:

SELECT
  first_name,
  program_name
FROM
  employees,
  trainings
ORDER BY
  first_name;Code language: SQL (Structured Query Language) (sql)

試一試

摘要 #

  • 使用 SQL CROSS JOIN 子句將第一個表中的每一行與第二個表中的每一行進行組合。

測驗 #

<iframe
  name="quiz"
  src="/quiz/?quiz=cross-join"
  height="700"
  width="600"
  class="iframe"
></iframe>
Code language: HTML, XML (xml)

資料庫 #

本教程是否有幫助?
© .