INNER JOIN、LEFT JOIN 和 RIGHT JOIN有什么区别?什么是自连接?

INNER JOINLEFT JOINRIGHT JOIN 都是多表连接的不同方式,它们的主要区别在于它们如何处理表之间不匹配的数据。下面分别介绍它们的区别。


目录

一.多表连接查询

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 表中没有对应的销售记录,因此 yearprice 显示为 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 JOININNER JOIN 的结果相同,因为 Sales 表中的所有 product_idProduct 表中都有匹配项。如果 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



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

猜你喜欢

转载自blog.csdn.net/m0_69519887/article/details/142859300