【问题标题】:Difference between these joins [duplicate]这些连接之间的区别[重复]
【发布时间】:2012-09-02 23:33:49
【问题描述】:

有什么区别

SELECT *
FROM TABLE_A a
JOIN TABLE_B b
  ON a.propertyA = b.propertyA        

还有查询

SELECT * from TABLE_A a, TABLE_B b where a.propertyA=b.propertyA.

【问题讨论】:

  • 第二个仍然被认为是“加入”,但它是老派版本

标签: sql join


【解决方案1】:

这两个例子是一样的。两者都执行一个 INNER JOIN 操作(即使它只是第二个示例中的 JOIN),它基本上返回所有包含与 ON 子句相关的匹配结果的行。

我的猜测是 JOIN 和 INNER JOIN 操作稍微快一点,因为它们是为特定目的而设计的,而 SELECT 语句可以修改以做更多事情。

【讨论】:

    【解决方案2】:

    INNER JOIN 是您在第一个语法中使用的 ANSI (SQL-92) 语法。它通常被认为更具可读性,尤其是当您连接大量表时。

    WHERE syntax (SQL-89) 更加面向关系模型。两个表 JOIN'ed 的结果是应用了过滤器的表的笛卡尔积,该过滤器仅选择与连接列匹配的那些行。

    使用 WHERE 语法更容易看到这一点。

    我宁愿继续使用ANSI 类型连接,因为如果你省略了ON 子句,则会生成错误,而如果你省略where 子句上的条件,旧类型的连接将不会产生一条错误消息,因此它将生成笛卡尔积。

    【讨论】:

    • +1 以获得很好的解释,如果您可以添加指向 ANSI(SQL-92) 和 (SQL-89) 文档的链接,那就太好了
    【解决方案3】:

    “join”版本已经出现了大约 20 年,并且是首选,因为它清楚地标识了用于连接的谓词,而不是用于过滤结果的谓词。
    如果与 left join 一起使用,它还允许外连接(如果 table_b 中没有匹配的行,您仍然可以获得 table_a 的行)。

    “逗号”版本不允许外连接(如果 table_b 中没有匹配的行,您将无法获得 table_a 的行)

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2021-02-09
      • 2023-03-15
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      相关资源
      最近更新 更多