SQL INNER JOIN

摘要:在本教程中,您將學習如何使用 SQL INNER JOIN 子句,根據條件合併兩個表中的行。

SQL INNER JOIN 子句簡介 #

INNER JOINSELECT 語句的一個可選子句。INNER JOIN 子句允許您合併兩個相關表中的行。

以下是 INNER JOIN 子句的語法:

SELECT
  column1,
  column2
FROM
  table1
  INNER JOIN table2 ON condition;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

在此語法中:

  • 首先,在 FROM 子句中指定第一個表 (table1)。
  • 其次,在 INNER JOIN 子句中提供您想要與第一個表合併行的第二個表 (table2)。
  • 第三,在 ON 關鍵字後定義一個用於匹配兩個表之間行的條件。這個條件被稱為連線條件。

對於 table1 中的每一行,INNER JOIN 子句會檢查 table2 中的每一行並核對條件。

如果條件trueINNER JOIN 會將兩個表中的行合併成一個單行,並將其包含在最終結果集中。

通常,該條件會比較兩個表的兩個列之間的值是否相等。

SELECT
  column1,
  column2
FROM
  table1
  INNER JOIN table2 ON column1 = column2;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

但是,連線條件可以是任何比較運算子,而不僅僅是等於運算子 (=)。

如果 INNER JOIN 需要多個條件,您可以使用 AND 運算子來組合它們。

理解 SQL 內連線 #

假設您有兩個表:

  • X 表有兩個列:id (鍵) 和 x
  • Y 表也有兩列:id(鍵)和 y
Y Table
X Table

內連線使用 id 列中的值來匹配 X 表和 Y 表之間的行。

內連線只包含 id 列中具有匹配值的行,不包含結果集中的不匹配行。

sql inner join visualization

下面的維恩圖是說明內連線的另一種方式。

sql inner join Venn diagram

SQL INNER JOIN 基礎示例 #

假設我們有兩個表:employeesdepartments

employees 表有三列:employee_idnamedepartment_id

employee_idnamedepartment_id
1Jane1
2Bob2
3MariaNULL

departments 表有兩列:department_iddepartment_name

department_iddepartment_name
1Sales
2市場營銷

以下語句使用內連線從 employees 表中選擇 employee_idname,並從 departments 表中選擇 department_name

SELECT
  employee_id,
  name,
  department_name
FROM
  employees
  INNER JOIN departments ON departments.department_id = employees.department_id;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

試一試

輸出

 employee_id | name | department_name
-------------+------+-----------------
           1 | Jane | Sales
           2 | Bob  | MarketingCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

查詢工作原理:

  • 步驟 1. FROM 子句返回 employees 表中的所有行。
  • 步驟 2. INNER JOIN 比較 employees 表中 department_id 列的值與 departments 表中 department_id 列的值。如果它們相等,INNER JOIN 子句會將兩個表中的行合併成一個單行。
  • 步驟 3. 查詢返回 SELECT 子句中指定的列的行。

以下是內連線的分解說明:

employees 表中的第 1 行 (department_id 為 1) 與 departments 表中的第 1 行 (department_id 為 1) 匹配。

employee_idnamedepartment_id
1Jane1
department_iddepartment_name
1Sales

INNER JOIN 子句將兩個表中的行合併成一個單行,如下所示:

employee_idnamedepartment_iddepartment_iddepartment_name
1Jane11Sales

employees 表中的第 2 行 (department_id 為 2) 與 departments 表中的第 2 行 (department_id 為 2) 匹配。

employee_idnamedepartment_id
1Bob2
department_iddepartment_name
2市場營銷

INNER JOIN 合併了兩個表中的行。

employee_idnamedepartment_iddepartment_iddepartment_name
2Bob22市場營銷

employees 表中的第 3 行與 departments 表中的第 1 行和第 2 行都不匹配。

在完成所有行的匹配後,INNER JOIN 得到以下中間結果集:

employee_idnamedepartment_iddepartment_iddepartment_name
1Jane11Sales
2Bob22市場營銷

SELECT 子句從 employee_idnamedepartment_name 列中檢索資料,形成以下結果集:

employee_idnamedepartment_name
1JaneSales
2Bob市場營銷

限定列名 #

下面的操作嘗試在結果集中包含 department_id 列:

SELECT
  employee_id,
  name,
  department_name,
  department_id
FROM
  employees
  INNER JOIN departments ON departments.department_id = employees.department_id;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

資料庫系統發出了以下錯誤:

ERROR:  column reference "department_id" is ambiguousCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

原因在於 employeesdepartment 表都擁有一個名為 department_id 的列。資料庫系統不知道該選擇哪一個。

為避免此錯誤,您需要明確告訴資料庫系統您想從哪個表中檢索 department_id 列的值。

為此,您可以使用以下語法來引用該列:

table_name.column_nameCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

例如:

SELECT
  employee_id,
  name,
  department_name,
  employees.department_id
FROM
  employees
  INNER JOIN departments ON departments.department_id = employees.department_id;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

試一試

輸出

 employee_id | name | department_name | department_id
-------------+------+-----------------+---------------
           1 | Jane | Sales           |             1
           2 | Bob  | Marketing       |             2Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

在此示例中,我們明確告訴資料庫系統從 employees 表的 department_id 列中選擇資料。

employees.department_idCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

使用表別名 #

SQL 允許您在查詢執行期間為一個表臨時分配一個新名稱。這個新名稱被稱為表別名

以下是定義表別名的語法:

table_name AS table_aliasCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

AS 關鍵字是可選的,所以您可以像這樣縮短它:

table_name table_aliasCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

引用列時,您可以使用表別名代替表名。

table_alias.column_nameCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

在實踐中,當連線具有相同列名的表時,您通常會使用表別名。例如:

SELECT
  employee_id,
  name,
  department_name,
  e.department_id
FROM
  employees e
  INNER JOIN departments d ON d.department_id = e.department_id;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

試一試

在此示例中,我們分配了表別名:

  • eemployees 表。
  • ddepartments 表。

並使用表別名引用列:

d.department_id
e.employee_idCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

表別名使查詢更簡潔。

連線兩個表 #

以下示例使用內連線來合併示例資料庫employeesdepartments 表的行。

請注意,這些表與上面提到的 employeesdepartments 表不同。

SQL INNER JOIN - Employees & Departments Tables
SELECT
  first_name,
  last_name,
  email,
  department_name
FROM
  employees e
  INNER JOIN departments d ON d.department_id = e.department_id
ORDER BY
  first_name,
  last_name;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

試一試

輸出

 first_name  |  last_name  |               email               | department_name
-------------+-------------+-----------------------------------+------------------
 Adam        | Fripp       | [email protected]        | Shipping
 Alexander   | Hunold      | [email protected]  | IT
 Alexander   | Khoo        | [email protected]    | Purchasing
 Britney     | Everett     | [email protected]   | Shipping
 Bruce       | Ernst       | [email protected]       | IT
...Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

連線三個表 #

要合併兩個以上表中的行,您需要使用額外的 INNER JOIN 子句。例如,以下是連線三個表的語法:

SELECT
  column1,
  column2,
  column3
FROM
  table1
  INNER JOIN table2 ON condition1
  INNER JOIN table3 ON condition2;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

它的工作原理如下:

  • 首先,查詢會根據 condition1condition2,將 table1 中的每一行與 table2table3 中的每一行進行匹配。如果這三個表中的行同時滿足兩個條件,INNER JOIN 子句會將這些表中的行合併成一個單行。
  • 然後,查詢從合併後的行中選擇列,並將它們包含在結果集中。

例如,以下查詢使用一個 INNER JOIN 子句來合併 employeesdepartmentsjobs 三個表中的行。

SQL INNER JOIN - Joining three tables

並選擇所有員工的名字、姓氏、職位和部門名稱。

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
ORDER BY
  first_name,
  last_name;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

試一試

輸出

 first_name  |  last_name  |            job_title            | department_name
-------------+-------------+---------------------------------+------------------
 Adam        | Fripp       | Stock Manager                   | Shipping
 Alexander   | Hunold      | Programmer                      | IT
 Alexander   | Khoo        | Purchasing Clerk                | Purchasing
 Britney     | Everett     | Shipping Clerk                  | Shipping
 Bruce       | Ernst       | Programmer                      | IT
...Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

摘要 #

  • 使用 SQL INNER JOIN 子句,根據條件合併兩個表中的行。

測驗 #

資料庫 #

本教程是否有幫助?
© .