原文: 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 列来实现,该列说明该行与第一张表的哪一行有关。

image-11

多对一

在多对一的关系中,第一张表的一条记录可以与第二张表的一条记录相关,而第二张表的一条记录可以与第一张表的多条记录相关。

在关系型数据库中,这可以通过第一张表有一个 second_table_id 列来实现,该列说明该行与第二张表的哪一行有关。

image-10Many-to-one

多对多

在这种情况下,多条记录与多条记录相关。

image-9Many-to-many

这种关系不能用 SQL 表来表示--你需要在两个表之间添加一个耦合表,这样表之间才会有多对一和一对多的关系。

中间的表的每一行都代表了左边表的行和右边表的行之间的一种关系。

image-12

在 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_idmatches.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 表,但它被用于说明如何合并 teamsprojects 表的行。

总结

语句 JOIN 允许你将一个或多个表连接起来。它必须和 ON 语句一起使用,以确定一个表的行和另一个表的行之间的关系。

在这篇文章中,你学习了如何使用 JOIN 语句来连接三个不同的表。