【问题标题】:JOINs vs SELECTing from many tablesJOIN 与从许多表中选择
【发布时间】:2011-12-10 05:16:39
【问题描述】:

我一直在四处寻找,但找不到答案,可能是因为我找不到提出问题的正确方法。所以这里是:有什么理由更喜欢这两个查询中的任何一个吗?

SELECT * FROM table1, table2 WHERE table1.id = table2.id;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

这个问题源于我正在尝试优化的一个更复杂的查询,但我认为这两个查询包含了问题的本质,希望通过这种方式提问对其他人更有用。提前致谢。

【问题讨论】:

  • 第一个查询是否有效?如果是这样,我认为它正在默默地进行某种形式的连接,但我不知道是什么类型。
  • 它确实有效,我在发布之前对其进行了测试。 ;)

标签: mysql join inner-join


【解决方案1】:

其实这两个查询是一样的,只有两种不同的写法。我个人认为后者为用户提供了更多的可读性。

【讨论】:

【解决方案2】:

来自what I gather 他们都是一样的。一个只是另一个的语法糖。

它被称为显式与隐式连接表示法。

【讨论】:

    【解决方案3】:

    它们是一样的。

    在基本格式中看到的许多差异通常存在于不同的数据库之间,例如 Oracle 和 mySQL。传统上,oracle 中的连接仅使用 table.foreign_id = table2.id 完成,而 mySQL 将使用 table1 join table2 on table1.foreign_key = table2.id

    类似地,joininner joinleft inner joinleft join 在不同的数据库实现之间会有所不同,因此最好查看当前数据库实现的手册/文档以确保其正常运行你想要什么。

    最近,ANSI 标准的语法变得更加标准化,但人们使用的内容通常显示其根源!
    这篇写得很好的文章-
    http://www.google.com/url?sa=t&source=web&cd=4&ved=0CD8QFjAD&url=http%3A%2F%2Fwww.kingtraining.com%2Fconfdownloads%2Fdownloads%2FOracle9iJoin_paper.pdf&ei=LOGdTpfiFOrV0QH4zpmECQ&usg=AFQjCNHjicW-tWmJfZcXwNi220LxjGvNhg&sig2=4tdM2lfgQ6AqiYudWWTirg

    提供了更多信息和历史,并很好地解释了各种内连接和外连接。

    【讨论】:

      【解决方案4】:
      SELECT * FROM table1, table2 WHERE table1.id = table2.id;
      

      SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
      

      将返回相同的结果。但是,在这种情况下,您应该更喜欢第二个。第一种形式仍然被广泛使用,因为 Oracle 很长时间不支持第二种形式。

      然而,声明 INNER JOIN 带有意图并强制您编写条件,因为 INNER JOIN 需要 ON 子句。对于较大的查询,它使查询更具可读性,并且更难跳过连接谓词。

      另外,请注意,我倾向于将第一种形式理解为:取两个表的笛卡尔积,并且只保留两个表中具有相同 ID 的行,在 SQL 中表示为SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id;.

      【讨论】:

        猜你喜欢
        • 2012-11-08
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 2020-07-12
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多