SQL Inner Join子句


在本教學中,我們將演示如何使用SQL INNER JOIN子句來查詢來自兩個或多個表的資料。

1. SQL INNER JOIN子句簡介

到目前為止,您已經學習了如何使用SELECT語句從單個表中查詢資料。 但是,SELECT語句不限於從單個表中查詢資料。 SELECT語句可以將多個表連結在一起。

連線表的過程稱為Join。 SQL提供了多種連線,如內連線,左連線,右連線,全外連線等。本教學重點介紹內連線。

內部連線子句通過兩列之間的關係連結兩個(或更多)表。 無論何時使用內連線子句,通常都要考慮交集。

通過一個簡單的例子來理解內連線概念要容易得多。

假設有兩個表:AB

A有四行:(1,2,3,4),表B有四行:(3,4,5,6)

當表A使用內部聯接與表B連線時,我們得到結果集(3,4),它是表A和表B的交集。

如下圖所示 -

對於表A中的每一行,內部連線子句查詢表B中的匹配行。如果匹配行,則它將包含在最終結果集中。

假設A&B表的列名是n,以下語句說明了內連線子句:

SELECT
  A.n
FROM A
INNER JOIN B ON B.n = A.n;

INNER JOIN子句出現在FROM子句之後。 在ON關鍵字之後指定表A和表B之間匹配的條件。這種情況稱為連線條件,即B.n = A.n

INNER JOIN子句可以連線三個或更多表,只要它們具有關係,通常是外來鍵關係。

例如,以下語句說明了如何連線3個表:ABC

SELECT
  A.n
FROM A
INNER JOIN B ON B.n = A.n
INNER JOIN C ON C.n = A.n;

2. SQL INNER JOIN範例

SQL INNER JOIN 2個表的範例

我們將使用employeesdepartments表來演示INNER JOIN子句的工作原理。這兩個表的結構和關係如下所示:

每個員工都屬於一個且只有一個部門,而每個部門可以擁有多個員工。 員工和部門表之間的關係是一對多的。

employees表中的department_id列是將員工連結到departments表的外來鍵列。

要獲取部門ID為:1,23的資訊,請使用以下語句。

SELECT
    department_id,
    department_name
FROM
    departments
WHERE
    department_id IN (1, 2, 3);

執行上面查詢語句,得到以下結果 -

+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             1 | 管理            |
|             2 | 市場行銷        |
|             3 | 採購            |
+---------------+-----------------+
3 rows in set

請注意,在WHERE子句中使用IN運算子來獲取department_id1,23的行。

要獲取在部門ID為:1,23中工作的員工的資訊,請使用以下查詢:

SELECT
    first_name,
    last_name,
    department_id
FROM
    employees
WHERE
    department_id IN (1, 2, 3)
ORDER BY
    department_id;

執行上面查詢語句,得到以下結果 -

要組合這兩個表中的資料,請使用內部連線子句,組成成以下查詢:

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);

執行上面查詢語句,得到以下結果 -

對於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表之間的關係是一對多的。

以下資料庫圖說明了employees, departmentsjobs 表之間的關係:

以下查詢使用內部聯接子句連線3個表:員工,部門和工作崗位,以獲取在部門ID為:1,23中工作的員工的名字,姓氏,職位和部門名稱。

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);

執行上面查詢語句,得到以下結果 -

通過上面的學習,現在您應該了解SQL INNER JOIN子句如何工作,並知道如何應用它來查詢來自多個表的資料。