【问题标题】:Explain which table to choose "FROM" in a JOIN statement说明在 JOIN 语句中选择“FROM”的表
【发布时间】:2014-10-03 18:28:13
【问题描述】:

我是 SQL 新手,如果我使用点表示法选择我想要的 tables.columns,我无法理解为什么在 JOIN 语句中有 FROM 关键字。我从两者中选择哪张桌子有关系吗?我在 w3schools 定义中没有看到任何解释,其中表是 FROM 表。在下面的示例中,我如何知道为FROM 选择哪个表?既然我基本上已经选择了要选择的table.column,可以吗?

例如:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

【问题讨论】:

  • 它们都是来自表...,您可以说来自订单和连接客户,如果是内部连接,查询将返回相同的结果。在左连接中,“来自”表是左表。当我开始使用 sql 时,这让我很困惑,所以请注意这一点,左连接与左外连接是一样的,唯一的区别是语法
  • 是的。它可以是任何一个。在您的示例中,可以交换两个表名,并且返回的行相同。 (表名的位置确实重要的是“外部”连接操作,即“a LEFT JOIN b”等价于“b RIGHT JOIN a”,但它不同于“a RIGHT JOIN b”。跨度>
  • FROM 表的定义而言:您实际选择“来自”的是连接操作的结果,而不是一个表或另一个表。 SQL 指定的是对两个表“Customers JOIN Orders ON ...”的“连接”操作。查询正在“从”连接操作的结果中选择。 (相等比较中表达式的顺序也不重要。a.col = b.col 相当于指定 b.col = a.col;相等比较运算符的一个属性。)限定 all 列是最佳实践查询中的引用(如您的示例所示。)
  • SELECT 是“来自”FROM 之后所有内容的结果。 FROM 不仅仅是它之后的第一个表。

标签: mysql sql join


【解决方案1】:

INNER JOIN 中的顺序无关紧要。

但是,在 LEFT JOINRIGHT JOIN 中确实很重要。在LEFT JOIN 中,FROM 子句中的表是主表;结果将包含从此表中选择的每一行,而LEFT JOIN 表中命名的行可能会丢失(这些列将在结果中为NULL)。 RIGHT JOIN 类似,但反过来:FROM 中命名的表中可能缺少行。

例如,如果您将查询更改为使用LEFT JOIN,您将看到没有订单的客户。但是,如果您交换表格的顺序并使用LEFT JOIN,您将看不到这些客户。您会看到没有客户的订单(尽管这样的行可能不应该存在)。

【讨论】:

    【解决方案2】:

    from 语句指的是连接而不是表。表的连接将创建一个集合,您将从中选择列。

    【讨论】:

    • +1。查询“从”选择的是连接操作指定的结果集,而不是一个表或另一个。
    【解决方案3】:

    对于inner joinfrom 子句中的哪个表和join 子句中的哪个表都没有关系。 对于outer joins,这当然很重要,因为outer join 中的表允许有“缺失”记录。

    【讨论】:

      【解决方案4】:

      内部连接无关紧要:优化器会找出读取表的正确顺序,而不管您选择的顺序。

      对于定向外连接,这很重要,因为它们不是对称的。您选择要在左外连接中保留第一个 FROM 表的所有行的表;对于右外连接,则相反。

      对于完全外连接,这无关紧要,因为完全外连接中的表是彼此对称使用的。

      在排序无关紧要的情况下,您选择对 SQL 语句的读者来说“自然”的顺序,无论这对您的模型意味着什么。 SQL 查询很快变得相当难以阅读,因此表的正确排序对于查询的人类读者来说很重要。

      【讨论】:

        【解决方案5】:

        在您当前的示例中,from 运算符可以应用于两个表。

        SELECT Customers.CustomerName, Orders.OrderID
        FROM Customers,Orders
        WHERE Customers.CustomerID=Orders.CustomerID
        ORDER BY Customers.CustomerName;
        

        ->将像您的代码一样工作

        逗号将连接两个表。

        From 仅表示您从哪个表中检索数据。

        在您的示例中,您使用不同的语法连接了两个表。 也可能是:

        SELECT Customers.CustomerName, Orders.OrderID
        FROM Orders
        INNER JOIN Customers
        ON Customers.CustomerID=Orders.CustomerID
        ORDER BY Customers.CustomerName;
        

        所有编写的代码都会产生相同的结果

        【讨论】:

        • 很好的例子,但我强烈建议不要像第一个例子那样编写查询
        • 你能解释一下原因吗?
        • 这是一种草率的语法,更难调试/增强,更不用说阅读了。如果您要加入 4 张桌子,它会很快变得一团糟。看看我刚刚找到的这个帖子stackoverflow.com/questions/11251751/…
        • 连接操作的老式逗号语法有效并且仍然受支持。对于所有仍在运行的遗留 SQL,这是一件好事。但我无法理解 OP 想要使用逗号运算符而不是使用 JOIN 关键字的改进语法的充分理由。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 2012-04-29
        • 2015-02-15
        • 1970-01-01
        相关资源
        最近更新 更多