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

课程 5.1 · 阅读时间:~8分钟

SQL JOIN根据相关列组合两个或多个表的行。在本课程中,您将学习JOIN的核心概念,如何编写ON条件,表别名的重要性,以及如何逐步查询Sakila数据库中的相关数据。

SQL JOIN:如何在关系数据库中组合表

在关系数据库中,信息以一组相关的表存储。要从中提取有意义的数据,您需要知道如何连接它们。SQL中的JOIN操作就是为此目的而使用的。它允许您根据相关列组合两个或多个表的行。

本课程为理解JOIN作为处理关系数据的关键概念奠定基础。

什么是SQL JOIN,它是如何工作的?

JOIN是一种机制,允许您将来自不同表的行组合成一个结果集。连接是基于条件执行的,该条件通常比较关键列中的值。

想象有两个表:customerpaymentpayment表有一个customer_id列,指示哪个客户进行了付款。JOIN让您可以“粘合”这两个表的行,以便对于每个付款,您可以看到客户的姓名,而不仅仅是他们的ID。

它是如何工作的:

  1. 您指定要连接的两个表。
  2. 您在ON子句中定义连接条件,例如,customer.customer_id = payment.customer_id
  3. 数据库遍历行,找到匹配的对,并从中形成新的组合行。

可视化:

  表A(customer)      表B(payment)
  +----+-------+            +----+----------+
  | id | name  |            | id | amount   |
  +----+-------+            +----+----------+
  | 1  | Ivan  | <-----\    | 1  | 100.00   |
  | 2  | Maria |       \--->| 1  | 50.00    |
  | 3  | Petr  |            | 3  | 200.00   |
  +----+-------+            +----+----------+

箭头显示payment表中的行如何根据匹配的id找到相应的客户。

如何在实践中使用JOIN:Sakila示例

让我们看看在使用Sakila数据库的实际SQL查询中,这看起来是什么样子。

  1. 获取客户及其付款的列表: 此查询连接customerpayment表,以显示每个付款旁边的客户的名字和姓氏。

    SELECT
        c.first_name,
        c.last_name,
        p.amount,
        p.payment_date
    FROM
        customer AS c
    JOIN
        payment AS p ON c.customer_id = p.customer_id;
    
    • JOIN payment AS p指定我们正在连接payment表。
    • ON c.customer_id = p.customer_id是定义行之间关系的条件。
    • cp别名,使查询更简短且更易读。
  2. 获取电影及其语言的列表: 让我们连接filmlanguage表,以显示每部电影的标题及其语言。

    SELECT
        f.title,
        l.name AS language
    FROM
        film AS f
    JOIN
        language AS l ON f.language_id = l.language_id;
    

    在这里,关系是通过language_id键建立的。


本课程的关键要点:

  • SQL JOIN将来自两个或多个表的行组合成一个结果集。
  • ON条件定义了不同表之间的行如何相关——通常通过匹配关键列。
  • 表别名customer AS c)缩短查询并使其更易于阅读。
  • JOIN不会修改原始数据;它创建一个临时结果集。
  • 在接下来的课程中,我们将详细探讨INNER JOINLEFT JOINRIGHT JOINFULL JOIN

INNER JOIN — 组合匹配的行


常见问题解答

JOIN和INNER JOIN之间有什么区别?

在SQL中,裸JOININNER JOIN的简写。它们产生相同的结果。显式的INNER JOIN关键字通常更受欢迎,以便于理解,特别是在同一查询中混合不同的连接类型时。

如果ON条件没有匹配的行,会发生什么?

如果没有行满足ON条件,INNER JOIN将返回一个空的结果集。不会引发错误——查询只是返回零行。其他连接类型(LEFT JOIN等)以不同的方式处理不匹配的行。

您可以在一个查询中连接多个表吗?

可以。您可以在单个查询中链接多个JOIN子句,每个子句都有自己的ON条件。数据库从左到右处理它们,逐步构建结果集。


面试问题

您如何向非技术同事解释JOIN?

JOIN就像使用共享ID在两个电子表格中查找相关信息。例如,如果一个表列出了带有ID的客户,而另一个表列出了带有客户ID的付款,JOIN让您可以看到每笔付款与客户的姓名——而无需在任何表中重复数据。

ON子句是什么,为什么需要它?

ON子句指定连接两个表的行的条件。如果没有它(或没有有效条件),数据库将生成笛卡尔积——第一个表中的每一行与第二个表中的每一行配对——这通常没有用且可能非常庞大。

为什么在JOIN查询中使用表别名?

表别名使查询更简短且不含歧义。当两个表共享列名(例如,两个表都有id)时,别名让您可以写c.idp.id,这样数据库和读者就能确切知道指的是哪个列。

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

  1. SQL 表连接类型