SQL INNER JOIN

摘要:在本教學中,您將學習如何使用 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 的交集。

請參閱下圖

SQL INNER JOIN

對於資料表 A 中的每一列,內部聯結子句會在資料表 B 中尋找相符的列。如果找到相符的列,則該列會包含在最終結果集中。

假設資料表 A 和 B 中的欄位分別為 ab。以下陳述式說明了內部聯結子句

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 聯結兩個資料表

我們將使用來自範例資料庫employeesdepartments 資料表來說明 INNER JOIN 子句如何運作。

emp_dept_tables

每位員工只隸屬於一個部門,而每個部門可以擁有多位員工。departmentsemployees 之間的關係是一對多。

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)

試試看

SQL INNER JOIN departments table

請注意,我們在 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)

試試看

SQL INNER JOIN employees table

若要結合這兩個資料表的資料,您可以使用內部聯結子句,如下列查詢所示

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)

試試看

SQL INNER JOIN example

對於 employees 資料表中的每一列,此陳述式會檢查 department_id 欄位的值是否等於 departments 資料表中 department_id 欄位的值。

如果條件 employees.department_id = departments.department_id 成立,則包含來自 employeesdepartments 資料表中列的資料的組合列會包含在結果集中。

請注意,employeesdepartments 資料表都具有相同的欄位名稱 department_id,因此我們必須使用語法 table_name.column_name 來限定 department_id 欄位。

SQL INNER JOIN 3 個資料表的範例

每位員工擔任一個職位,而一個職位可能由多位員工擔任。jobs 資料表和 employees 資料表之間的關係是一對多。

以下資料庫圖表說明了 employeesdepartmentsjobs 資料表之間的關係

emp_dept_jobs_tables

以下查詢使用內部聯結子句來聯結 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 3 tables example

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

本教學對您有幫助嗎?