摘要:在本教學中,您將學習如何使用 SQL INNER JOIN 子句從兩個或多個資料表中查詢資料。
SQL INNER JOIN 子句簡介
到目前為止,您已經學習如何使用 SELECT 陳述式從單一資料表中查詢資料。然而,SELECT
陳述式不僅限於從單一資料表查詢資料。 SELECT
陳述式可以將多個資料表連結在一起。
連結資料表的過程稱為聯結。SQL 提供了多種類型的聯結,例如內部聯結、左聯結、右聯結、完整外部聯結等。本教學著重於內部聯結。
假設您有兩個資料表:A 和 B。
資料表 A 有四列:(1,2,3,4),而資料表 B 有四列:(3,4,5,6)
當資料表 A 使用內部聯結與資料表 B 聯結時,您會得到結果集 (3,4),這是資料表 A 和 B 的交集。
請參閱下圖

對於資料表 A 中的每一列,內部聯結子句會在資料表 B 中尋找相符的列。如果找到相符的列,則該列會包含在最終結果集中。
假設資料表 A 和 B 中的欄位分別為 a
和 b
。以下陳述式說明了內部聯結子句
SELECT a
FROM A
INNER JOIN B ON b = a;
Code language: SQL (Structured Query Language) (sql)
INNER JOIN 子句出現在 FROM 子句之後。資料表 A 和 B 之間比對的條件是在 ON 關鍵字之後指定。此條件稱為聯結條件,例如 B.n = A.n
只要它們之間存在關聯(通常是外鍵關聯),INNER JOIN 子句就可以聯結三個或更多資料表。
例如,以下陳述式說明如何聯結 3 個資料表:A、B 和 C
SELECT
A.n
FROM A
INNER JOIN B ON B.n = A.n
INNER JOIN C ON C.n = A.n;
Code language: SQL (Structured Query Language) (sql)
SQL INNER JOIN 範例
讓我們舉一些使用 INNER JOIN
子句的實際範例。
1) 使用 SQL INNER JOIN 聯結兩個資料表
我們將使用來自範例資料庫的 employees
和 departments
資料表來說明 INNER JOIN
子句如何運作。

每位員工只隸屬於一個部門,而每個部門可以擁有多位員工。departments
和 employees
之間的關係是一對多。
employees
資料表中的 department_id
欄位是將 employees
連結到 departments
資料表的外鍵欄位。
若要取得部門 ID 為 1、2 和 3 的資訊,您可以使用以下陳述式。
SELECT
department_id,
department_name
FROM
departments
WHERE
department_id IN (1, 2, 3);
Code language: SQL (Structured Query Language) (sql)

請注意,我們在 WHERE 子句中使用了 IN 運算子來取得 department_id 為 1、2 和 3 的列。
若要取得在部門 ID 為 1、2 和 3 的部門工作的員工資訊,您可以使用以下查詢
SELECT
first_name,
last_name,
department_id
FROM
employees
WHERE
department_id IN (1, 2, 3)
ORDER BY
department_id;
Code language: SQL (Structured Query Language) (sql)

若要結合這兩個資料表的資料,您可以使用內部聯結子句,如下列查詢所示
SELECT
first_name,
last_name,
employees.department_id,
departments.department_id,
department_name
FROM
employees
INNER JOIN
departments ON departments.department_id = employees.department_id
WHERE
employees.department_id IN (1 , 2, 3);
Code language: SQL (Structured Query Language) (sql)

對於 employees
資料表中的每一列,此陳述式會檢查 department_id
欄位的值是否等於 departments
資料表中 department_id
欄位的值。
如果條件 employees.department_id = departments.department_id
成立,則包含來自 employees
和 departments
資料表中列的資料的組合列會包含在結果集中。
請注意,employees
和 departments
資料表都具有相同的欄位名稱 department_id
,因此我們必須使用語法 table_name.column_name
來限定 department_id
欄位。
SQL INNER JOIN 3 個資料表的範例
每位員工擔任一個職位,而一個職位可能由多位員工擔任。jobs
資料表和 employees
資料表之間的關係是一對多。
以下資料庫圖表說明了 employees
、departments
和 jobs
資料表之間的關係

以下查詢使用內部聯結子句來聯結 3 個資料表:employees、departments 和 jobs,以取得在部門 ID 為 1、2 和 3 的部門工作的員工的名字、姓氏、職稱和部門名稱。
SELECT
first_name,
last_name,
job_title,
department_name
FROM
employees e
INNER JOIN departments d ON d.department_id = e.department_id
INNER JOIN jobs j ON j.job_id = e.job_id
WHERE
e.department_id IN (1, 2, 3);
Code language: SQL (Structured Query Language) (sql)

現在,您應該了解 SQL INNER JOIN 子句如何運作,並且知道如何將其應用於從多個資料表查詢資料。