摘要:本教程将介绍如何使用 SQL INNER JOIN 子句查询两个或更多表中的数据。
SQL INNER JOIN 子句介绍
到目前为止,你已了解如何使用 SELECT 语句从单个表中查询数据。然而,SELECT
语句并不仅限于从单个表查询数据,它还可以将多个表链接在一起。
链接表的进程被称为联接。SQL 提供了多种联接类型,例如内联接、左连接、右连接、全外连接等。本教程重点介绍内连接。
假设你有两个表 A 和 B。
表 A 有四行:(1,2,3,4),表 B 有四行:(3,4,5,6)
当表 A 使用内连接与表 B 连接时,你得到的结果集 (3,4) 是表 A 和 B 的交集。
请看下图

对于表 A 中的每一行,内联接子句都会在表 B 中查找匹配行。如果找到匹配项,则会将其包含在最终结果集中。
假设表 A 和表 B 中的列为 a
和 b
。以下语句演示了内联接子句
SELECT a
FROM A
INNER JOIN B ON b = a;
Code language: SQL (Structured Query Language) (sql)
INNER JOIN 子句出现在 FROM 子句之后。在 ON 关键字之后指定用于在表 A 和 B 之间匹配的条件。此条件称为联接条件,即B.n = A.n
只要表具有关系(通常是外键关系),INNER JOIN 子句就可以连接三个或更多表。
例如,以下语句演示了如何连接三个表: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 连接两个表
将使用 示例数据库 中的 employees
和 departments
表来演示 INNER JOIN
子句如何工作的。

每个员工只属于一个部门,而每个部门可以有多名员工。departments
和 employees
之间的关系是一对多。
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)

请注意,我们在 WHERE 子句 中使用了 IN 运算符 来获取部门 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)

若要组合这两个表的中的数据,请使用内联接子句,如下所示
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)

对于 employees
表中的每一行,语句都会检查 department_id
列的值是否等于 departments
表中 department_id
列的值。
如果条件 employees.department_id = departments.department_id
满足,则包含两个表 employees
和 departments
行中数据的组合行将包括在结果集中。
请注意,表 employees
和 departments
具有相同的列名 department_id
,因此我们必须使用语法 table_name.column_name
限定列名 department_id
。
SQL INNER JOIN 3 表示例
每个员工只从事一个工作,而一个工作可以由许多员工从事。jobs
表和 employees
表之间的关系是一对多。
下列数据库图表说明 employees
、departments
和 jobs
之间的关系

下列查询使用 inner join 子句连接 3 个表:employees、departments 和 jobs 以获取部门编号 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 子句如何工作以及知道如何将其应用于查询来自多个表的数据。