原文: SQL Inner Join – How to Join 3 Tables in SQL and MySQL
当你在使用数据库时,可能需要把几个不同的表的数据放在一起。这篇文章将告诉你如何做。
我已经写了两篇关于 SQL 连接的文章,第一篇和第二篇,但让我们花点时间先回顾一下连接是如何工作的,特别是 MySQL 特有的语法。
SQL Join 语句
Join 是一个语句,让你把两个表放在一起,匹配彼此相关的行,只保留可以匹配的行,不保留未配对的行。
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
两个表之间通用的 INNER JOIN 语句
SELECT ... FROM 语句指出哪个是第一个表,然后第二个表的名字就写在 INNER JOIN 关键字的后面。
两个表如何连接是写在 ON 语句中。在这个例子中,两个表是使用 table1.id = table2.id 的关系连接的。
可以同时使用多个连接语句来连接多个表。
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
三个表之间通用的 INNER JOIN 语句
要做到这一点,你需要添加第二个 INNER JOIN 语句和第二个 ON 语句来表示第三个表和第二个表的关系。
让我们来讨论一下表之间的关系,以及为什么要把三个表连接在一起。
SQL 中表之间的关系
当你有相互关联的表时,它们之间的关系可以是以下类型之一。
一对多
在一对多的关系中,第一个表的一条记录可以与第二个表的多条记录相关。
在关系型数据库中,这可以通过第二张表有一个 first_table_id 列来实现,该列说明该行与第一张表的哪一行有关。

多对一
在多对一的关系中,第一张表的一条记录可以与第二张表的一条记录相关,而第二张表的一条记录可以与第一张表的多条记录相关。
在关系型数据库中,这可以通过第一张表有一个 second_table_id 列来实现,该列说明该行与第二张表的哪一行有关。
Many-to-one
多对多
在这种情况下,多条记录与多条记录相关。
Many-to-many
这种关系不能用 SQL 表来表示--你需要在两个表之间添加一个耦合表,这样表之间才会有多对一和一对多的关系。
中间的表的每一行都代表了左边表的行和右边表的行之间的一种关系。

在 MySQL 的实践中,该中间表将有一列 first_table_id 和一列 second_table_id,每个组合都是唯一的。
连接 SQL 表实践
让我们想象一下,我们有一个组织的数据库,其中有一个团队表(他们的名字,和其他识别信息),和一个项目表(名字、进度,等等)。
| ID | TEAM_NAME | SPECIALTY |
|---|---|---|
| 1 | Banana Throwers | Bananas |
| 2 | Wood gnawers | Gnawing on wood |
| 3 | The Pink Elephants | Stomping on the ground |
| 4 | Fluffy potatoes | Working and sleeping |
| ID | PROJECT_NAME | PROGRESS |
|---|---|---|
| 1 | Dam building | Some more wood gnawing and ground stomping needed |
| 2 | Banana Cake | Someone is eating all the bananas |
| 3 | Sleep research | To much sleeping not enough research |
由于一个团队可以从事多个项目,而一个项目可以由多个团队从事,因此还有第三个表格,记录团队-项目的匹配情况。
| PROJECT_ID | GROUP_ID |
|---|---|
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
当我们需要以人类可读的方式查看表的信息时,我们可以使用 JOIN 语句把所有的东西放在一起,就像这样:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
我们用 SELECT 语句选择显示每个表的哪些列。
我们用 ON 语句指定表的行的组合方式。
我们用 ORDER BY 语句以我们喜欢的方式排列这些行。
ON 语句 teams.id = matches.team_id 和 matches.projects_id = projects.id 意味着使用 matches 表的行来组合。输出表的每一行都有项目名称和团队名称,并使用 matches 表中的项目 id 和团队 id 对进行组合。
输出表将如下所示。
| TEAM_NAME | PROJECT_NAME |
|---|---|
| Banana Throwers | Banana Cake |
| Banana Throwers | Sleep Research |
| Wood gnawers | Dam Bulding |
| Wood gnawers | Sleep Research |
| The Pink Elephants | Dam Building |
| The Pink Elephants | Dam Building |
| Fluffy potatoes | Sleep Research |
没有直接来自 matches 表的列。在输出中没有显示 matches 表,但它被用于说明如何合并 teams 和 projects 表的行。
总结
语句 JOIN 允许你将一个或多个表连接起来。它必须和 ON 语句一起使用,以确定一个表的行和另一个表的行之间的关系。
在这篇文章中,你学习了如何使用 JOIN 语句来连接三个不同的表。