【问题标题】:Difference between JOIN and INNER JOINJOIN 和 INNER JOIN 的区别
【发布时间】:2010-10-08 14:44:30
【问题描述】:

这两个连接都会给我相同的结果:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

对

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

在性能方面或其他方面的陈述之间有什么区别吗?

不同的 SQL 实现之间有区别吗?

【问题讨论】:

  • 看到这个问题:stackoverflow.com/questions/448023?sort=newest>
  • 附带说明:CROSS JOIN 是一种很好了解的连接类型(它不同于 INNER JOIN)。
  • 根据 ANSI SQL 92 规范,它们是相同的:“3) 如果指定了 而未指定 ,则 INNER 是隐式的。”
  • 我非常喜欢简单的JOIN,INNER真的更清晰吗?如果我阅读 JOIN 没有其他词,那就是一个连接。

标签: sql sql-server join inner-join


【解决方案1】:

不,没有区别,纯syntactic sugar。

【讨论】:

  • 我不会称之为语法糖。可能是“默认”连接类型、“速记”或“别名”。
  • 在计算机科学中,语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达。我相信省略INNER 的能力属于此定义。
  • 如果你从字面上应用这个定义,是的,但我一直看到它保留用于更有趣的语法类型,而不仅仅是事物的替代名称。
  • @Quassnoi 提出这个问题的事实表明,INNER 的缺失确实 not 使查询更易于阅读。据我所知,JOIN 很可能意味着LEFT JOIN,如果这里的答案没有澄清的话。
  • @Quassnoi 您的评论引用的介绍性 wiki 声明对句法糖是正确的,但作为定义还不够。语法糖化是针对复杂语法的特殊情况的更简单的语法。说 INNER 是一个“噪音词”更合适。
【解决方案2】:

它们在功能上是等效的,但INNER JOIN 可以更清晰地阅读,特别是如果查询中包含其他连接类型(即LEFT 或RIGHT 或CROSS)。

【讨论】:

  • 所有数据库(例如 SQL、postgres)都是这样吗?有谁知道解释此问题的文档的链接吗?
  • @Ivanzinho:键盘敲击不是查询或程序复杂性的衡量标准。现实生活中的复杂性来自可维护性,其中可读性起着重要作用。事实上,当它说 INNER JOIN 时,您可以确定它做了什么并且应该就是这样,而普通的 JOIN 会让您或其他人想知道标准对实现的看法以及 INNER /OUTER/LEFT 被意外或故意遗漏。
  • 感谢@Indian 的链接。 key 保存在第一个的第 181 页,在描述第 180 页的生成语法时:“如果指定了 而未指定 ,则 INNER 是隐式的。”
【解决方案3】:

与OUTER JOINs 类似,单词"OUTER" 是可选的。正是 LEFT 或 RIGHT 关键字使 JOIN 成为 "OUTER" JOIN。

但是由于某种原因,我总是使用 "OUTER" 和 LEFT OUTER JOIN 一样,从不使用 LEFT JOIN,但我从不使用 INNER JOIN,而是只使用 "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

【讨论】:

  • 我和你相反:我总是说“INNER JOIN”但我从不使用OUTER;所以“左连接”和“右连接”。猜猜我只是保持我的角色数量不变!
  • @Jonathan。内部连接没有方向概念。外连接可能会产生不匹配的结果集,并且这些结果集可能会因方向而异。内部需要匹配,因此方向无关紧要。
【解决方案4】:

内连接 = 连接

INNER JOIN 是默认值,如果您不指定使用单词 JOIN 时的类型。

您也可以使用 LEFT OUTER JOIN 或 RIGHT OUTER JOIN,在这种情况下,单词 OUTER 是可选的, 或者您可以指定 CROSS JOIN。

或

对于内连接,语法是:

选择 ...
从表A
[INNER] 加入表 B

(换句话说,“INNER”关键字是可选 - 结果相同 有或没有)

【讨论】:

    【解决方案5】:

    不同的 SQL 实现有区别吗?

    是的,Microsoft Access 不允许只允许 join。它需要inner join。

    【讨论】:

      【解决方案6】:

      正如其他答案已经说明的那样,您的示例没有区别。

      相关的语法位是documented here

      <join_type> ::= 
          [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
          JOIN
      

      显示所有都是可选的。该页面进一步阐明了

      INNER 指定返回所有匹配的行对。丢弃 两个表中不匹配的行。 当没有指定连接类型时,这 是默认的。

      语法也确实表明有一次需要INNER 。指定连接提示时。

      请看下面的例子

      CREATE TABLE T1(X INT);
      CREATE TABLE T2(Y INT);
      
      SELECT *
      FROM   T1
             LOOP JOIN T2
               ON X = Y;
      
      SELECT *
      FROM   T1
             INNER LOOP JOIN T2
               ON X = Y;
      

      【讨论】:

        猜你喜欢
        • 2014-03-11
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        相关资源
        最近更新 更多