摘要:在本教程中,您將學習如何使用 SQL INNER JOIN 子句,根據條件合併兩個表中的行。
SQL INNER JOIN 子句簡介 #
INNER JOIN 是 SELECT 語句的一個可選子句。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 中的每一行並核對條件。
如果條件為 true,INNER 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。
內連線使用 id 列中的值來匹配 X 表和 Y 表之間的行。
內連線只包含 id 列中具有匹配值的行,不包含結果集中的不匹配行。
下面的維恩圖是說明內連線的另一種方式。
SQL INNER JOIN 基礎示例 #
假設我們有兩個表:employees 和 departments。
employees 表有三列:employee_id、name 和 department_id。
| employee_id | name | department_id |
|---|---|---|
| 1 | Jane | 1 |
| 2 | Bob | 2 |
| 3 | Maria | NULL |
departments 表有兩列:department_id 和 department_name。
| department_id | department_name |
|---|---|
| 1 | Sales |
| 2 | 市場營銷 |
以下語句使用內連線從 employees 表中選擇 employee_id 和 name,並從 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_id | name | department_id |
|---|---|---|
| 1 | Jane | 1 |
| department_id | department_name |
|---|---|
| 1 | Sales |
INNER JOIN 子句將兩個表中的行合併成一個單行,如下所示:
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 1 | Jane | 1 | 1 | Sales |
employees 表中的第 2 行 (department_id 為 2) 與 departments 表中的第 2 行 (department_id 為 2) 匹配。
| employee_id | name | department_id |
|---|---|---|
| 1 | Bob | 2 |
| department_id | department_name |
|---|---|
| 2 | 市場營銷 |
INNER JOIN 合併了兩個表中的行。
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 2 | Bob | 2 | 2 | 市場營銷 |
employees 表中的第 3 行與 departments 表中的第 1 行和第 2 行都不匹配。
在完成所有行的匹配後,INNER JOIN 得到以下中間結果集:
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 1 | Jane | 1 | 1 | Sales |
| 2 | Bob | 2 | 2 | 市場營銷 |
SELECT 子句從 employee_id、name 和 department_name 列中檢索資料,形成以下結果集:
| employee_id | name | department_name |
|---|---|---|
| 1 | Jane | Sales |
| 2 | Bob | 市場營銷 |
限定列名 #
下面的操作嘗試在結果集中包含 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)原因在於 employees 和 department 表都擁有一個名為 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)在此示例中,我們分配了表別名:
e給employees表。d給departments表。
並使用表別名引用列:
d.department_id
e.employee_idCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)表別名使查詢更簡潔。
連線兩個表 #
以下示例使用內連線來合併示例資料庫中 employees 和 departments 表的行。
請注意,這些表與上面提到的 employees 和 departments 表不同。

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)它的工作原理如下:
- 首先,查詢會根據
condition1和condition2,將table1中的每一行與table2和table3中的每一行進行匹配。如果這三個表中的行同時滿足兩個條件,INNER JOIN子句會將這些表中的行合併成一個單行。 - 然後,查詢從合併後的行中選擇列,並將它們包含在結果集中。
例如,以下查詢使用一個 INNER JOIN 子句來合併 employees、departments 和 jobs 三個表中的行。

並選擇所有員工的名字、姓氏、職位和部門名稱。
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子句,根據條件合併兩個表中的行。