INNER JOIN
、LEFT JOIN
和 RIGHT JOIN
都是多表连接的不同方式,它们的主要区别在于它们如何处理表之间不匹配的数据。下面分别介绍它们的区别。
目录
一.多表连接查询
▐ INNER JOIN(内连接)
当你在使用 JOIN
时不明确指定是 LEFT JOIN
还是 RIGHT JOIN
,SQL 默认会执行 INNER JOIN
,即内连接。
- 工作原理:只返回在两个表中都有匹配记录的行。如果某一行在其中一个表中没有匹配的记录,它将不会出现在结果集中。
- 特点:只返回匹配的记录。
例子:
-
Product表:
product_id product_name 1 Laptop 2 Smartphone 3 Tablet -
Sales表:
sale_id product_id year price 1 1 2023 1000 2 2 2023 800 -
INNER JOIN查询SQL语句:
SELECT Product.product_name, Sales.year, Sales.price FROM Product INNER JOIN Sales ON Product.product_id = Sales.product_id;
-
结果:
product_name year price Laptop 2023 1000 Smartphone 2023 800
注意:Tablet
没有出现在结果中,因为它在 Sales
表中没有匹配的销售记录。
▐ LEFT JOIN(左连接)
- 工作原理:返回左表的所有记录,即使右表中没有匹配的记录。如果右表中没有对应的行,结果中的右表字段将会是
NULL
。 - 特点:返回左表的所有记录,以及右表中匹配的数据。
例子:
-
LEFT JOIN查询SQL语句:
SELECT Product.product_name, Sales.year, Sales.price FROM Product LEFT JOIN Sales ON Product.product_id = Sales.product_id;
-
结果:
product_name year price Laptop 2023 1000 Smartphone 2023 800 Tablet NULL NULL
注意:Tablet
出现在结果中,但它在 Sales
表中没有对应的销售记录,因此 year
和 price
显示为 NULL
。
▐ RIGHT JOIN(右连接)
- 工作原理:返回右表的所有记录,即使左表中没有匹配的记录。如果左表中没有对应的行,结果中的左表字段将会是
NULL
。 - 特点:返回右表的所有记录,以及左表中匹配的数据。
例子:
-
RIGHT JOIN查询SQL语句:
SELECT Product.product_name, Sales.year, Sales.price FROM Product RIGHT JOIN Sales ON Product.product_id = Sales.product_id;
-
结果:
product_name year price Laptop 2023 1000 Smartphone 2023 800
注意:这个例子中的 RIGHT JOIN
和 INNER JOIN
的结果相同,因为 Sales
表中的所有 product_id
在 Product
表中都有匹配项。如果 Sales
表中有多余的记录,RIGHT JOIN
会包含它们,且 Product
表的字段为 NULL
。
二.区别
JOIN 类型 | 描述 | 结果返回的数据 |
---|---|---|
INNER JOIN | 只返回两个表中都存在匹配数据的记录。 | 仅匹配的行 |
LEFT JOIN | 返回左表的所有数据,即使右表中没有匹配的记录,右表的列会为 NULL 。 |
左表的所有行 |
RIGHT JOIN | 返回右表的所有数据,即使左表中没有匹配的记录,左表的列会为 NULL 。 |
右表的所有行 |
- INNER JOIN:左表和右表中都匹配的部分。
- LEFT JOIN:左表的所有部分,即使右表没有匹配,也显示
NULL
。 - RIGHT JOIN:右表的所有部分,即使左表没有匹配,也显示
NULL
。
选择哪种 JOIN
方式取决于希望在查询中保留哪些表的数据。如果想要保留所有的左表数据,使用 LEFT JOIN
;如果想要保留所有右表数据,使用 RIGHT JOIN
;如果只想要两者都有匹配的数据,使用 INNER JOIN
。
三.自连接
平常可能还会用到自连接,就像下题这样,我们需要在这个表中对比不同行的数据,就需要使用自连接
就像这里,为这个表使用俩个别名,通过 join 来完成
SELECT
W1.id
FROM
Weather W1
JOIN
Weather W2
ON
DATEDIFF(W1.recordDate, W2.recordDate) = 1
WHERE
W1.Temperature > W2.Temperature
本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!
如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!
有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见