🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 5.2: INNER JOIN - 组合匹配行

在上一课中,我们建立了连接表以检索相关数据的基本概念。最常见和使用频率最高的连接类型是 INNER JOIN。在本课中,我们将详细探讨其逻辑、语法和实际应用。

什么是 INNER JOIN?

INNER JOIN 是一种操作,仅在两个表中根据指定条件存在匹配值时,才会组合这两个表的行。如果表 A 中的某一行在表 B 中没有对应的匹配,则该行将被排除在结果集之外。同样,表 B 中任何不匹配表 A 的行也会被排除。

可以将其视为两个数据集的 交集

可视化:

   表 A (客户)           表 B (付款)
   +----+----------+            +----+----------+
   | id | 姓名     |            | id | 金额     |
   +----+----------+            +----+----------+
   | 1  | 爱丽丝   | <--------> | 1  | 10.00    | (匹配!)
   | 2  | 鲍勃     |            | 1  | 15.00    | (匹配!)
   | 3  | 查理     |            | 4  | 20.00    | (查理或 ID 4 没有匹配)
   +----+----------+            +----+----------+

在这个例子中,查理被排除,因为他没有付款,而 customer_id 为 4 的付款被排除,因为没有该 ID 的客户。

INNER JOIN 语法

INNER JOIN 的标准语法为:

SELECT
    table1.column1,
    table2.column2
FROM
    table1
INNER JOIN
    table2 ON table1.common_column = table2.common_column;
  • INNER JOIN:指定我们只想要匹配的行。
  • ON:定义匹配的条件(通常是一个表的主键和另一个表的外键)。

注意: 在大多数 SQL 数据库(如 MySQL、PostgreSQL 和 SQL Server)中,关键字 INNER 是可选的。写 JOININNER JOIN 将产生完全相同的结果。

实际示例(Sakila 数据库)

1. 连接城市与国家

city 表包含一个 country_id,它指向 country 表。为了查看城市名称及其国家名称,我们使用 INNER JOIN

SELECT
    ci.city,
    co.country
FROM
    city AS ci
INNER JOIN
    country AS co ON ci.country_id = co.country_id;

此查询仅返回与有效国家相关联的城市。

2. 列出员工及其地址

为了找出每位员工的居住地,我们连接 staffaddress 表。

SELECT
    s.first_name,
    s.last_name,
    a.address,
    a.district
FROM
    staff AS s
INNER JOIN
    address AS a ON s.address_id = a.address_id;

连接多个表

您可以链接多个 INNER JOIN 子句,以一次性从多个表中收集信息。例如,要查看某个演员出演的电影,我们需要三个表:actorfilm 和连接表 film_actor

SELECT
    a.first_name,
    a.last_name,
    f.title
FROM
    actor AS a
INNER JOIN
    film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
    film AS f ON fa.film_id = f.film_id
LIMIT 10;

工作原理:

  1. 第一个连接基于 actor_id 连接 actorfilm_actor
  2. 第二个连接基于 film_id 将第一个连接的结果与 film 表连接。
  3. 只有在所有三个表中都存在的记录才满足条件并出现在结果中。

本课的关键要点

  • INNER JOIN 是 SQL 中的默认连接类型。
  • 仅当两个表中存在 匹配 时,它才会返回行。
  • 不满足连接条件的行将从结果集中 丢弃
  • 通过添加后续的 INNER JOIN 语句,您可以连接多个表。
  • 使用 表别名AS ciAS co)使复杂的连接更易于阅读和编写。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 使用 JOIN 查找地址
  2. 查找电影中的所有演员
  3. 演员的电影
  4. 视频数据库项目上的员工