在 SQL 中,JOIN 用于根据相关列将多个表的数据组合在一起。主要的 JOIN 类型包括 INNER JOIN(简称 JOIN)、LEFT JOIN 和 RIGHT JOIN。让我们分别解释它们的区别:
1. JOIN / INNER JOIN
- 只返回两个表中 匹配 的行,匹配条件通常是基于
ON关键字指定的列。 - 如果某一行在任意一个表中没有匹配项,则该行不会出现在结果集中。
示例:
SELECT A.id, A.name, B.order_id
FROM Customers A
JOIN Orders B ON A.id = B.customer_id;结果: 只返回 Customers 表和 Orders 表中 都匹配 的 customer_id 记录。
2. LEFT JOIN / LEFT OUTER JOIN
- 返回 左表(第一个表) 的所有行,即使在右表中找不到匹配项。
- 如果右表中没有匹配项,则结果集中该部分的值为
NULL。
示例:
SELECT A.id, A.name, B.order_id
FROM Customers A
LEFT JOIN Orders B ON A.id = B.customer_id;结果: 返回 Customers 表中的所有客户,即使某个客户没有下过订单,其 order_id 也会显示 NULL。
3. RIGHT JOIN / RIGHT OUTER JOIN
- 返回 右表(第二个表) 的所有行,即使在左表中找不到匹配项。
- 如果左表中没有匹配项,则结果集中该部分的值为
NULL。
示例:
SELECT A.id, A.name, B.order_id
FROM Customers A
RIGHT JOIN Orders B ON A.id = B.customer_id;结果: 返回 Orders 表中的所有订单,即使某个订单没有匹配的客户,其 name 也会显示 NULL。
4. 总结对比
| JOIN 类型 | 结果包含的行 |
|---|---|
INNER JOIN | 只返回 两张表都有匹配项 的行 |
LEFT JOIN | 返回 左表所有行,即使右表没有匹配项 |
RIGHT JOIN | 返回 右表所有行,即使左表没有匹配项 |
5. 视觉示意图
INNER JOIN
A | B
----|----
1 | 1
2 | 2
LEFT JOIN
A | B
----|----
1 | 1
2 | 2
3 | NULL
RIGHT JOIN
A | B
----|----
1 | 1
2 | 2
NULL | 4
Let’s see how far we can take this tonight – https://rb.gy/es66fc?pync