ChatGPT解决这个技术问题 Extra ChatGPT

JOIN 和 INNER JOIN 的区别

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

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

对比

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

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

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

根据 ANSI SQL 92 规范,它们是相同的:“3) 如果指定了 而未指定 ,则 INNER 是隐式的。”

S
Sled

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


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

不,没有区别,纯粹的 syntactic sugar


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

内连接 = 连接

如果您在使用单词 JOIN 时未指定类型,则默认为 INNER JOIN。您还可以使用 LEFT OUTER JOIN 或 RIGHT OUTER JOIN,在这种情况下,单词 OUTER 是可选的,或者您可以指定 CROSS JOIN。

或者

对于内连接,语法为:SELECT ... FROM TableA [INNER] JOIN TableB(换句话说,“INNER”关键字是可选的 - 有或没有它的结果都相同)


P
Peter Mortensen

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

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


P
Peter Mortensen

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

但是由于某种原因,我总是像在 LEFT OUTER JOIN 中一样使用 "OUTER" 而从不使用 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。内部连接没有方向概念。外连接可能会产生不匹配的结果集,并且这些结果集可能会因方向而异。内部需要匹配,因此方向无关紧要。
M
Martin Smith

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

相关的语法位是 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;

https://i.stack.imgur.com/J4DX4.png