跳至主要内容

SQL 连接(Join)教程

本教程将讲解如何在 SQL Server 中使用主键和外键将表连接在一起。
· 5分钟 阅读

使用 AI 探索

SQL Server 是一种关系型数据库管理系统。关系型数据库的一个关键原则是数据分布存储在多个表中。

关系型数据库管理系统

为了提取所需数据,我们需要能够将表连接在一起。我们使用 primary 和 foreign 键来连接表。

主键(Primary Key)

主键是用于唯一标识表中每一行的列。这种唯一性可以通过使用顺序整数作为标识列来实现。或者,有时现有列本身就包含唯一值,也可以用作主键。

在下面的示例中,我们可以看到 artist 表的前几行。它有两列,artist_id 和 name。artist_id 列充当此表的主键,它是整数列,并且每个值都不同。

+-----------+-------------------+
| artist_id | name              |
|-----------+-------------------|
| 1         | AC/DC             |
| 2         | Accept            |
| 3         | Aerosmith         |
| 4         | Alanis Morissette |
| 5         | Alice In Chains   |
+-----------+-------------------+

现在来看 album 表。您能找到主键吗?是的,就是 album_id 列。主键通常被命名为“表名_下划线_id”。不过,您也会注意到还有一个 artist_id 列。它同样由整数构成,且与 artist 表中的 artist_id 列同名。这意味着什么?

+----------+-------------------------+-----------+
| album_id | title                   | artist_id |  
|----------+-------------------------+-----------|
| 1        | For Those About To Rock | 1         |
| 2        | Balls to the Wall       | 2         |
| 3        | Restless and Wild       | 2         |
| 4        | Let There Be Rock       | 1         |
| 5        | Big Ones                | 3         |
+----------+-------------------------+-----------+

外键(Foreign Keys)

从上面的输出可以清楚地看到,artist 表中的 artist_id 充当了 album 表的一个 Foreign_key。FOREIGN KEY 约束用于防止破坏表与表之间链接的操作。

  • artist 表
+-----------+-------------------+
| artist_id | name              |
|-----------+-------------------|
| 1         | AC/DC             |
| 2         | Accept            |
| 3         | Aerosmith         |
| 4         | Alanis Morissette |
| 5         | Alice In Chains   |
+-----------+-------------------+
  • album 表
+----------+-------------------------+-----------+
| album_id | title                   | artist_id |  
|----------+-------------------------+-----------|
| 1        | For Those About To Rock | 1         |
| 2        | Balls to the Wall       | 2         |
| 3        | Restless and Wild       | 2         |
| 4        | Let There Be Rock       | 1         |
| 5        | Big Ones                | 3         |
+----------+-------------------------+-----------+

这意味着当 album 表中的 artist_id 与 artist 表中的 artist_id 匹配时,这些行就可以作为一次 JOIN 被链接起来。

连接 Album 和 Artist

artist 表中的第 1 行和第 4 行的 artist_id 值都是 1。artist 表中 artist_id 为 1 的艺术家是 AC/DC。因此,当我们将两个表连接起来时,会返回 album 表中的专辑详情,以及 artist 表中对应的艺术家详情——使用两个表共有的 artist_id 字段进行连接。

这被称为 inner 连接。

SELECT
  album_id,
  title,
  album.artist_id,
  name AS artist_name
FROM album
INNER JOIN artist ON artist.artist_id = album.artist_id
WHERE album.artist_id = 1;
+----------+-------------------------+-----------+-------------+
| album_id | title                   | artist_id | artist_name |
|----------+---------------------------------------+-----------|
| 1        | For Those About To Rock | 1         | AC/DC       |
| 4        | Let There Be Rock       | 1         | AC/DC       |
+----------+-------------------------+-----------+-------------|

我们通过将 artist 表中的 artist_id 与 album 表中的 artist_id 相匹配来连接了 album 和 artist 两个表。

当从不同表中选择同名列时,您必须使用完整限定的列名。否则,SQL Server 将无法知道应从哪个表中 SELECT 该列。

要完整限定列名,您需要在其前面加上相应的表名,随后加上一个点号。

Inner Join 语法

这里有一个通用示例来帮助回忆语法。当我们从主表(此处为 table_A)选择相关列后,再选择希望连接的附加列(此处来自 table_B)。然后使用关键字 INNER JOIN 和 ON 指定连接,并提供两个表中所需的键列。

SELECT
    table_A.columnX,
    table_A.columnY,
    table_B.columnZ,
FROM table_A
INNER JOIN table_B ON table_B.foreign_key = table_A.primary_key;

不使用 WHERE 子句

在这个示例中,我们没有指定 WHERE 子句,因此会返回 artist 和 album 表之间所有匹配的所有组合,同样基于两个表共有的 artist_id 列。

SELECT
  album_id,
  title,
  album.artist_id,
  name AS artist_name
FROM album
INNER JOIN artist on artist.artist_id = album.artist_id;
+----------+---------------------------------------+-----------+
| album_id | title                   | artist_id | artist_name |
|----------+---------------------------------------+-----------|
| 1        | For Those About To Rock | 1         | AC/DC       |
| 4        | Let There Be Rock       | 1         | AC/DC       |
| 2        | Balls To The Wall       | 2         | Accept      |
| 3        | Restless and Wild       | 2         | Accept      |
+----------+---------------------------------------+-----------+

多重 Inner Join

您也可以使用 INNER JOINS 将两个以上的表连接起来。对于每一组表的组合,只需再提供一个 INNER JOIN 即可。在下面的代码中,我们连接了表 A 和 B,以及 B 和 C。

SELECT
  table_A.columnX,
  table_A.columnY,
  table_B.columnZ table_C columnW
FROM table_A
INNER JOIN table_B ON table_B.foreign_key = table_A.primary_key
INNER JOIN table_C ON table_C.foreign_key = table_B.primary_key;

要进一步学习如何连接表,请观看我们课程 Introduction to SQL Server 中的这个视频。

本文内容摘自 John MacKintosh 在 DataCamp 推出的 Introduction to SQL Server 课程。

主题