如果我只需要带有外键的表中的信息,为什么要使用 JOIN?

问题描述

我有一个主键为 customerNumber 的表 Customer。我还有一个表 customerOrder,在 Customer 表中有一个外键 FK_customerNumbercustomerNumber

我知道 customerNumber 并且只需要 select 订购与该用户相关的信息。

我看到很多使用这样的 JOIN 的教程

SELECT 
projectNumber,orderNumber
FROM
    `customerOrder` t1
        INNER JOIN `customer` t2 
            ON t1.`FK_customerNumber` = t2.`customerNumber`
        WHERE 
            t2.`customerNumber` = 50;

它正在工作,但为什么我不能只选择 FK?我得到相同的结果。 customerOrder 中的 FK 和 customer 中的 PK 的值是一样的。

这给了我相同的结果而没有 JOIN

SELECT 
projectNumber,orderNumber
FROM
    `customerOrder`
WHERE 
    `FK_customerNumber` = 50;

我知道我是否需要来自这样的两个表的信息,但现在我只需要来自 customerOrder 的信息

SELECT customerOrder.`projectNumber`,customer.`username`
FROM `customerOrder`
INNER JOIN customer ON customerOrder.`FK_customerNumber` = customer.`customerNumber`;

解决方法

为什么我不能只选择 FK

你可以。

我不能代表教程作者,但我敢猜测他们正试图演示 JOIN 的工作原理 - 您在左边有东西的原则 和 右侧 相关的内容,JOIN 是您将这两件事联系起来的方式。

如果您执行 EXPLAIN SELECT ... - 您可能会看到 MySQL 已经优化完全查看左表,因为它知道您只真正处理右侧的数据。

我可以预见到需要 JOIN 的唯一情况是,如果右侧没有外键约束。在这种情况下,更详细的 SELECT ... FROM ... JOIN ... 将确保如果左侧缺少任何内容,您不会从右侧获得任何东西(外键约束会阻止这种情况发生)。

您可能选择更详细的其他原因:

  • 查询“更明确” - 重新访问它的人可以一目了然地看到两个表的关系(这可能是可取的,具体取决于上下文)
  • 您打算很快从左侧提取一些额外数据(功能尚未在代码中完成)

同样,为了确保最佳性能,您可以明确选择来包含连接。 (但正如我所说,您会惊讶于 MySQL 在自身优化方面的出色表现:-))