JOIN和INNER JOIN之间的区别

dri*_*iis 925 sql sql-server join inner-join

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

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK
Run Code Online (Sandbox Code Playgroud)

VS

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK
Run Code Online (Sandbox Code Playgroud)

表现或其他方面的陈述是否有任何区别?

不同的SQL实现之间是否有所不同?

pal*_*rse 1017

它们在功能上是等价的,但INNER JOIN读取起来可能更清晰,特别是如果查询中包含其他连接类型(即LEFTRIGHTCROSS).

  • @Ivanzinho:键盘敲击次数不是查询或程序复杂性的衡量标准。现实生活中的复杂性来自于可维护性,其中可读性起着重要作用。事实上,当它说 INNER JOIN 时,您可以确定它的作用,并且它应该就是这样,而普通的 JOIN 会让您或其他人想知道标准关于实现的内容以及 INNER 是什么/OUTER/LEFT 因意外或故意而被遗漏。 (23认同)
  • 也许我是纯粹主义者,但我认为在编写SQL时,明确而不是隐含更好.INNER JOIN更具可读性,特别是在复杂查询中. (15认同)
  • 通过编写JOIN,查询很清楚,INNER只是噪音. (10认同)
  • 对所有数据库都是如此(例如SQL,postgres?)有没有人知道解释这个的文档的链接? (9认同)
  • 明确同意“内部”更具可读性。 (6认同)
  • 感谢@Indian 的链接。第 181 页的 _key_ 在描述第 180 页的生成语法时保持:“如果指定了 <qualified join> 并且未指定 <join type>,则 INNER 是隐式的。” (4认同)
  • 它是ANSI SQL标准.查看更多:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt; https://en.wikipedia.org/wiki/SQL-92 (3认同)

Qua*_*noi 226

不,没有区别,纯粹的语法糖.

  • *在计算机科学中,语法糖是编程语言中的语法,旨在使事物更易于阅读或表达*.我相信省略`INNER`的能力属于这个定义. (58认同)
  • 我不会称这种语法糖."默认"加入类型,"速记"或"别名"也许. (18认同)
  • 如果你非常直接地应用这个定义,是的,但我总是看到它保留了更有趣的语法类型,而不仅仅是事物的替代名称. (9认同)
  • @Quassnoi事实上这个问题被问到,显示"INNER"的缺席确实_not_使查询更容易阅读.据我所知,如果没有通过这里的答案清除,那么`JOIN`就可能意味着"LEFT JOIN". (6认同)
  • @Quassnoi您的评论引述的wiki引言确实适用于语法糖,但不足以作为定义。语法加糖是针对复杂语法的特殊情况的更简单语法。更恰当地说INNER是一个“噪音词”。 (2认同)

net*_*rog 130

INNER JOIN =加入:

如果在使用单词JOIN时未指定类型, INNER JOIN是默认值.

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

要么

对于内连接,语法为:

SELECT ...
FROM TableA
[INNER] JOIN TableB

(换句话说,"INNER"关键字是可选的 - 无论是否有结果都是相同的)


Mic*_*aga 51

不同的SQL实现之间是否有所不同?

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


Kri*_*ten 49

OUTER JOINs此类似,这个词"OUTER"是可选的.它是LEFT或者RIGHT关键字使得JOINa "OUTER" JOIN.

但是由于某种原因,我总是使用"OUTER"in in LEFT OUTER JOIN和never 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
Run Code Online (Sandbox Code Playgroud)

  • 我是你的对立面:我总是说"INNER JOIN",但我从不使用OUTER; 所以"LEFT JOIN"和"RIGHT JOIN".猜猜我只是保持我的角色数不变! (20认同)
  • @ Jonathan.内连接上没有方向概念.外连接可以产生无与伦比的结果集,并且可以根据方向而变化.内部要求匹配所以方向无关紧要. (9认同)

Mar*_*ith 25

正如其他答案已经说明的那样,你的例子没有区别.

语法的相关位被记录在这里

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN
Run Code Online (Sandbox Code Playgroud)

显示所有都是可选的.该页面进一步澄清了这一点

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;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述