SQL INNER JOIN

摘要:本教程将介绍如何使用 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 的交集。

请看下图

SQL INNER JOIN

对于表 A 中的每一行,内联接子句都会在表 B 中查找匹配行。如果找到匹配项,则会将其包含在最终结果集中。

假设表 A 和表 B 中的列为 ab。以下语句演示了内联接子句

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 连接两个表

将使用 示例数据库 中的 employeesdepartments 表来演示 INNER JOIN 子句如何工作的。

emp_dept_tables

每个员工只属于一个部门,而每个部门可以有多名员工。departmentsemployees 之间的关系是一对多。

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)

试用

SQL INNER JOIN departments table

请注意,我们在 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)

试用

SQL INNER JOIN employees table

若要组合这两个表的中的数据,请使用内联接子句,如下所示

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)

试用

SQL INNER JOIN example

对于 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 表之间的关系是一对多。

下列数据库图表说明 employeesdepartmentsjobs 之间的关系

emp_dept_jobs_tables

下列查询使用 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 3 tables example

现在您应该了解 SQL INNER JOIN 子句如何工作以及知道如何将其应用于查询来自多个表的数据。

本教程是否有用?