JOIN 和 INNER JOIN 的区别

1414

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

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

vs

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

这些语句在性能或其他方面有区别吗?

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


5
请看这个问题:http://stackoverflow.com/questions/448023?sort=newest - Joel Coehoorn
3
根据ANSI SQL 92规范,它们是相同的:“3)如果指定了<qualified join>并且未指定<join type>,则INNER是隐式的。” - DaFi4
7个回答

1549

它们在功能上是等价的,但是INNER JOIN更容易阅读,特别是当查询中包含其他连接类型(即LEFTRIGHTCROSS)时。


23
所有数据库(如SQL、postgres)都适用吗?有人知道有关解释的文档链接吗? - Chogg
22
这是ANSI SQL标准。更多信息请参阅:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt;https://en.wikipedia.org/wiki/SQL-92。 - Indian
48
键盘敲击并不能衡量查询或程序的复杂性。现实中的复杂性源自于可维护性,其中易读性起着重要作用。当使用“INNER JOIN”时,你可以确定它的功能并且它应该就是这样,而使用普通的“JOIN”会让你或其他人想知道标准对实现做出了什么规定,是意外地还是故意地漏掉了 INNER/OUTER/LEFT。 - Tuukka Haapaniemi
4
感谢@Indian提供的链接。在第一个链接的第181页中,关键信息是描述第180页的生成语法:“如果指定了<qualified join>并且未指定<join type>,则INNER是隐式的。” - Olivier

343

41
我不会把这称作语法糖。也许可以称之为“默认”连接类型、"简写"或"别名". - mk12
92
在计算机科学中,语法糖是指在编程语言中设计用于使阅读或表达更加容易的语法。我认为省略INNER就符合这个定义。 - Quassnoi
23
如果您非常严格地应用定义,那么是的,但我始终认为它应该保留给更有趣的句法类型,而不仅仅是事物的替代名称。 - mk12
32
仅仅因为这个问题被提出,就表明缺少INNER并不会使查询更易读。就我所知,如果没有这里的答案进行澄清,JOIN很可能意味着LEFT JOIN - martennis
4
@Quassnoi,你引用的维基百科概述是关于语法糖的,但这并不足以作为定义。语法糖是针对复杂语法的特殊情况提供更简化语法的一种方法。更准确地说,应该把INNER称为“噪声词”。 - philipxy
显示剩余2条评论

221

内连接 = 连接

  • 当使用单词JOIN而不指定类型时,INNER JOIN是默认选项。

    您还可以使用LEFT OUTER JOIN或RIGHT OUTER JOIN,此时单词OUTER是可选的,或者您可以指定CROSS JOIN。

或者

  • 对于内连接,语法如下:

SELECT ...
FROM TableA
[INNER] JOIN TableB

(换句话说,INNER关键字是可选的--使用或不使用该关键字结果相同。)


76

不同的SQL实现之间有所不同吗?

是的,Microsoft Access 不允许使用只有 join 的语法,而需要用 inner join


59

同样地,对于OUTER JOINs,单词"OUTER"是可选的。是LEFTRIGHT关键字使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

29
我和你相反:我总是说“INNER JOIN”,但从不使用“OUTER JOIN”;所以用的是“LEFT JOIN”和“RIGHT JOIN”。猜想我只是为了让字符数量保持恒定! - Stephen Holt
10
在内连接中,没有方向的概念。外连接可以生成不匹配的结果集,这些结果集可能因方向而异。内连接要求匹配,因此方向无关紧要。 - Karl Kieninger

42

正如其他答案已经指出的那样,在你的例子中没有区别。

语法中相关的部分在这里记录。

<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;

在此输入图片描述


-2
INNER JOIN和JOIN是一样的。 在性能和输出上没有区别。 当与等价条件一起使用时(例如一个表的一列等于第二个表的一列),两者都会给出一个交集,这个条件写在'ON'中。
也可以按照旧的语法实现这个效果,而不使用join这个词,如下所示。
SELECT * FROM TABLE1, TABLE2 WHERE TABLE1.COLUMN1=TABLE2.COLUMN4;
(使用随机数作为列名)
以上三种方法都会给出完全相同的结果。

4
这对于这个非常古老且受欢迎的问答中的众多答案没有任何增值。而且,就像大多数答案一样,用词过多,因为答案只是“不”。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接