使用数据库时,可能需要将几个不同表中的数据放在一起。本文将向您展示如何操作。
我已经在这里和这里写了关于SQL连接的文章,但让我们先花点时间回顾一下连接是如何工作的,特别是特定于MySQL的语法。
SQL 连接声明
Join 是一种语句,它允许您将两个表放在一起,匹配彼此相关的行,并仅保留可以匹配的行,而不保留不成对的行。
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
两个表之间的通用内部连接语句该语句指示哪个是第一个表,然后第二个表名紧跟在关键字之后写入。 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
ON
让我们来谈谈表之间可以建立的关系,以及为什么您可能希望将三个表连接在一起。
SQL 中表之间的关系
当您的表彼此相关时,它们的关系可以是各种类型之一。
一对多
在一对多关系中,第一个表的一行可以与第二个表的多行相关。
在关系数据库中,这可以通过第二个表来实现,该表具有一列,该列表示该行与第一个表的哪一行相关。 first_table_id
多对一
在多对一关系中,第一个表的一行可以与第二个表的一行相关,第二个表的一行可以与第一个表的多行相关。
在关系数据库中,这可以通过第一个表具有一列来实现,该列表示该行与第二个表的哪一行相关。 second_table_id
多对一
多对多
在这种情况下,多行与多行相关。
多对多这种关系不能像 SQL 表那样表示 – 您需要在两个表之间添加耦合表,以便表之间只存在多对一和一对多关系。
中间表的每一行表示左表的行与右表的行之间的一种关系。
在 MySQL 中,中间表将有一列 for 和一列 ,每个组合都是唯一的。 first_table_id
second_table_id
在实践中联接 SQL 表
让我们想象一下,我们有一个组织的数据库,其中有一个包含团队(他们的姓名和其他标识信息)的表,以及一个包含项目(名称,进度等)的表。
编号 | TEAM_NAME | 专业 |
---|---|---|
1 | 香蕉投掷者 | 香蕉 |
2 | 木材啃食者 | 啃木头 |
3 | 粉红大象 | 踩在地上 |
4 | 蓬松的土豆 | 工作和睡眠 |
编号 | PROJECT_NAME | 进展 |
---|---|---|
1 | 大坝建设 | 需要更多的木材啃咬和地面踩踏 |
2 | 香蕉蛋糕 | 有人正在吃掉所有的香蕉 |
3 | 睡眠研究 | 给很多睡眠没有足够的研究 |
由于一个团队可以处理多个项目,并且一个项目可以由多个团队处理,因此还有第三个表用于跟踪团队与项目的匹配。
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
语句和 表示使用表的行进行组合。输出表的每一行都具有使用表中的项目 ID 和团队 ID 对组合的项目名称和团队名称。 ON
teams.id = matches.team_id
matches.projects_id = projects.id
matches
matches
输出表将如下所示。
TEAM_NAME | PROJECT_NAME |
---|---|
香蕉投掷者 | 香蕉蛋糕 |
香蕉投掷者 | 睡眠研究 |
木材啃食者 | 大坝建设 |
木材啃食者 | 睡眠研究 |
粉红大象 | 大坝建设 |
粉红大象 | 大坝建设 |
蓬松的土豆 | 睡眠研究 |
表中没有直接的列。该表未显示在输出中,但它用作有关如何合并 和 表的行的说明。 matches
matches
teams
projects