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) 如果指定了不,没有区别,纯syntactic sugar。
【讨论】:
我不会称之为语法糖。可能是“默认”连接类型、“速记”或“别名”。 在计算机科学中,语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达。我相信省略INNER
的能力属于此定义。
如果你从字面上应用这个定义,是的,但我一直看到它保留用于更有趣的语法类型,而不仅仅是事物的替代名称。
@Quassnoi 提出这个问题的事实表明,INNER
的缺失确实 not 使查询更易于阅读。据我所知,JOIN
很可能意味着LEFT JOIN
,如果这里的答案没有澄清的话。
@Quassnoi 您的评论引用的介绍性 wiki 声明对句法糖是正确的,但作为定义还不够。语法糖化是针对复杂语法的特殊情况的更简单的语法。说 INNER 是一个“噪音词”更合适。【参考方案2】:
它们在功能上是等效的,但INNER JOIN
可以更清晰地阅读,特别是如果查询中包含其他连接类型(即LEFT
或RIGHT
或CROSS
)。
【讨论】:
所有数据库(例如 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 页的生成语法时:“如果指定了与OUTER JOINs
类似,单词"OUTER"
是可选的。正是 LEFT
或 RIGHT
关键字使 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 的区别
SQL中inner join,outer join和cross join的区别