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的交集。

如下圖所示 -

SQL Inner Join子句

對於表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子句的工作原理。這兩個表的結構和關係如下所示:
SQL 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;

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

SQL Inner Join子句

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

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

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

SQL Inner Join子句

對於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 表之間的關係:

SQL Inner Join子句

以下查詢使用內部聯接子句連接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子句

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