JOIN 和 INNER JOIN 的区别

Posted

技术标签:

【中文标题】JOIN 和 INNER JOIN 的区别【英文标题】:Difference between JOIN and 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 实现之间有区别吗?

【问题讨论】:

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

不,没有区别,纯syntactic sugar

【讨论】:

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

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

【讨论】:

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

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

【讨论】:

我和你相反:我总是说“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;

【讨论】:

以上是关于JOIN 和 INNER JOIN 的区别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中inner join 和 cross join 的区别

inner join 和outer join的区别

SQL中inner join,outer join和cross join的区别

JOIN 和 INNER JOIN 的区别

SQL中inner join,outer join和cross join的区别

mysql 里面JOIN 和 INNER JOIN 区别是啥