【问题标题】:What's the difference between the two SQL join notations?两种 SQL 连接表示法有什么区别?
【发布时间】:2011-11-24 01:36:28
【问题描述】:

SQL 1:select * from t1 join t2 on t1.f1 = t2.f2

SQL 2:select * from t1,t2 where t1.f1 = t2.f2

他们返回的结果是一样的。它们之间有什么区别吗?例如,DBMS 如何运行它们,或者在查询计划中?

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

这两个查询在操作上没有区别。

但是,显式连接表示法是更好的学习和使用方式;将另一个留给(尚未更改的)遗留代码。

【讨论】:

    【解决方案2】:

    一种是旧样式,一种是新 (ANSI) 样式。我发现您为什么要使用新样式的主要原因是对外部连接的标准支持。对于旧样式,外部连接是特定于供应商的。新风格有它的标准:

    select * from t1 left outer join t2 on t1.f1 = t2.f2
    

    在您的示例中,SQL 1 是新样式,SQL 2 是旧样式,顺便说一句。

    【讨论】:

    • 您可能想要指出哪个是“旧样式”,哪个是“新样式”。
    • 特定于供应商是否意味着它取决于不同的 SQL 产品(如 sqlserver 和 oracle)?
    • 是的,完全正确 - 事实上,这里刚刚发布了另一个关于这种差异的问题:stackoverflow.com/questions/8251323/…
    • 'Old style' 内部连接,这个问题是关于的,从 SQL-89 到现在的标准一直在 SQL 标准中(我预测将永远存在)。自 SQL-92 以来,标准一直是 ISO(其中 I = 国际),而不仅仅是 ANSI(其中 A = 美国)。
    【解决方案3】:

    基本上这两个查询在操作上没有区别。

    但是,两者具有相同的执行计划和相同的成本,这意味着两个查询需要相同的时间来执行(相同的性能)。

    使用连接运算符是一种现代方式。

    【讨论】:

      【解决方案4】:

      两者在语义上是等价的(在主题的其他变体中)。一个区别是,Stackoverflow 上的许多用户都非常直言不讳地表达了他们对“旧式”内部连接(您的 SQL 2)的不容忍,以至于任何发布它们的人都有被否决的风险,除了在 cmets 中受到警告之外。您还可能会看到应用了“反模式”一词,这是无稽之谈。在 SO 社区之外,我还没有遇到过这种风格不容忍的情况。事实上,“旧式”内连接在 SQL 文献中很常见。

      【讨论】:

      • 可能是因为在 SO SQL 标记中活动了一段时间的任何人都会 see lots of examples 进行无意的笛卡尔连接,而使用显式 JOIN 语法可以避免这种连接。
      • @MartinSmith:你的逻辑是有缺陷的:我在 SO SQL 标签中活跃了一段时间,并没有对这种风格产生不容忍;)我宁愿认为它是出于心理原因而发展的;我可以将SELECT *NATURAL JOIN 与“如果……可能会发生坏事”相提并论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 2012-06-04
      • 1970-01-01
      • 2013-09-08
      • 2019-03-31
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多