课程 5.1 · 阅读时间:~8分钟
SQL JOIN根据相关列组合两个或多个表的行。在本课程中,您将学习JOIN的核心概念,如何编写ON条件,表别名的重要性,以及如何逐步查询Sakila数据库中的相关数据。
SQL JOIN:如何在关系数据库中组合表
在关系数据库中,信息以一组相关的表存储。要从中提取有意义的数据,您需要知道如何连接它们。SQL中的JOIN操作就是为此目的而使用的。它允许您根据相关列组合两个或多个表的行。
本课程为理解JOIN作为处理关系数据的关键概念奠定基础。
什么是SQL JOIN,它是如何工作的?
JOIN是一种机制,允许您将来自不同表的行组合成一个结果集。连接是基于条件执行的,该条件通常比较关键列中的值。
想象有两个表:customer和payment。payment表有一个customer_id列,指示哪个客户进行了付款。JOIN让您可以“粘合”这两个表的行,以便对于每个付款,您可以看到客户的姓名,而不仅仅是他们的ID。
它是如何工作的:
- 您指定要连接的两个表。
- 您在
ON子句中定义连接条件,例如,customer.customer_id = payment.customer_id。 - 数据库遍历行,找到匹配的对,并从中形成新的组合行。
可视化:
表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查询中,这看起来是什么样子。
获取客户及其付款的列表: 此查询连接
customer和payment表,以显示每个付款旁边的客户的名字和姓氏。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是定义行之间关系的条件。c和p是别名,使查询更简短且更易读。
获取电影及其语言的列表: 让我们连接
film和language表,以显示每部电影的标题及其语言。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 JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。
常见问题解答
JOIN和INNER JOIN之间有什么区别?
在SQL中,裸JOIN是INNER JOIN的简写。它们产生相同的结果。显式的INNER JOIN关键字通常更受欢迎,以便于理解,特别是在同一查询中混合不同的连接类型时。
如果ON条件没有匹配的行,会发生什么?
如果没有行满足ON条件,INNER JOIN将返回一个空的结果集。不会引发错误——查询只是返回零行。其他连接类型(LEFT JOIN等)以不同的方式处理不匹配的行。
您可以在一个查询中连接多个表吗?
可以。您可以在单个查询中链接多个JOIN子句,每个子句都有自己的ON条件。数据库从左到右处理它们,逐步构建结果集。
面试问题
您如何向非技术同事解释JOIN?
JOIN就像使用共享ID在两个电子表格中查找相关信息。例如,如果一个表列出了带有ID的客户,而另一个表列出了带有客户ID的付款,JOIN让您可以看到每笔付款与客户的姓名——而无需在任何表中重复数据。
ON子句是什么,为什么需要它?
ON子句指定连接两个表的行的条件。如果没有它(或没有有效条件),数据库将生成笛卡尔积——第一个表中的每一行与第二个表中的每一行配对——这通常没有用且可能非常庞大。
为什么在JOIN查询中使用表别名?
表别名使查询更简短且不含歧义。当两个表共享列名(例如,两个表都有id)时,别名让您可以写c.id与p.id,这样数据库和读者就能确切知道指的是哪个列。