JOIN和INNER JOIN之间的区别


997

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

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

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

语句之间的性能或其他方面是否有区别?

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



6
附带说明:CROSS JOIN是一种很好的联接类型(与INNER JOIN不同)。
Serge

Answers:


1091

它们在功能上是等效的,但阅读起来INNER JOIN可能更清晰,尤其是在查询中包含其他联接类型(即LEFTor RIGHTCROSS)的情况下。


11
这是否适用于所有数据库(例如SQL,postgres?),是否有人知道解释此内容的文档链接?
Chogg


14
仅通过编写JOIN即可使查询足够清楚,而INNER只是噪音。
伊万津尼奥(Ivanzinho)

22
也许我是一个纯粹主义者,但是我认为编写SQL时,显式要比隐式好。INNER JOIN更具可读性,尤其是在复杂的查询中。
bruceskyaus

3
@Ivanzinho:键盘笔触不是查询或程序复杂性的度量。现实生活中的复杂性来自于可维护性,其中可读性起着主要作用。事实上,当它说INNER JOIN时,您可以确定它的作用,并且应该只是这样,而普通的JOIN会离开您或其他人,不知道标准对实现的含义以及INNER的含义。 / OUTER / LEFT因意外或故意遗漏。
Tuukka Haapaniemi

243

不,没有区别,纯语法糖


21
我不会称其为语法糖。可能是“默认”联接类型,“速记”或“别名”。
mk12

62
在计算机科学中,语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达。我相信忽略的能力INNER属于这个定义。
Quassnoi 2015年

13
如果您按字面意义应用定义,是的,但是我一直看到它保留用于更有趣的语法类型,而不仅仅是事物的替代名称。
mk12 2015年

9
@Quassnoi这一事实,这个问题是问,节目由于缺少INNER没有让查询更容易阅读。就我所知,JOIN这很可能意味着LEFT JOIN如果这里的答案没有解决它。
martennis

2
@Quassnoi您的评论引述的wiki引言确实适用于语法糖,但不足以作为定义。语法加糖是针对复杂语法的特殊情况的更简单语法。更恰当地说INNER是一个“噪音词”。
philipxy

143

内联接=联接

如果在使用单词JOIN时未指定类型,则默认为INNER JOIN。

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

要么

对于内部联接,语法为:

SELECT ...
FROM TableA
[INNER] JOIN TableB

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



54

与相似OUTER JOINs,该单词"OUTER"是可选的。是LEFTor RIGHT关键字使JOINan "OUTER" JOIN

但是由于某种原因,我总是使用"OUTER"in,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

23
我与您相反:我总是说“ INNER JOIN”,但我从不使用OUTER;因此是“ LEFT JOIN”和“ RIGHT JOIN”。猜猜我只是保持角色数量不变!
Stephen Holt 2012年

10
@乔纳森。内部联接没有方向的概念。外部联接可能会产生不匹配的结果集,并且结果集可能会根据方向而变化。内部需要匹配,因此方向无关紧要。
卡尔·基宁格

32

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

相关的语法记录在这里

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.