对于 SQL,啥时候开始需要始终使用“Inner Join”而不是隐式连接?

Posted

技术标签:

【中文标题】对于 SQL,啥时候开始需要始终使用“Inner Join”而不是隐式连接?【英文标题】:For SQL, when did it start to be desirable to always use the words "Inner Join" instead of implicitly joinly?对于 SQL,什么时候开始需要始终使用“Inner Join”而不是隐式连接? 【发布时间】:2011-02-11 23:38:06 【问题描述】:

对于 SQL,什么时候开始需要始终使用“Inner Join”而不是隐式连接:

select * from t1, t2 where t1.ID = t2.ID;

?只是为了风格还是为了区分外连接还是有其他原因?

【问题讨论】:

对于“防止以前的歧义”的答案,我们可以举个例子吗? 【参考方案1】:

ansi-92 标准,嗯,这很难,我会​​拼命去猜 1992 年

【讨论】:

【参考方案2】:

INNER 和 OUTER JOIN 语法在 SQL-92 规范中正式化。在 mysql 和 SQL Server 等许多数据库产品中,您可以在内部连接中省略“INNER”一词,而直接使用“JOIN”。类似地,许多数据库产品允许您省略“OUTER”一词,而只使用“LEFT JOIN”或“RIGHT JOIN”进行外部连接。 *==* 的旧外连接语法在许多情况下会产生歧义。许多产品已经或很快将停止支持旧的外连接语法。

在 SQL-92 规范之前,供应商各自使用自己的语法来表示外连接。即*= 不是通用的(我似乎记得有人使用?=)。此外,他们没有以通用的方式实现外连接。举个例子:

Table1
Col1    Col2
1       Alice
2       Bob

Table2
Col1    Col2
1           1
2           2
3           3
4           4

Select 
From Table1, Table2
Where Table2.Col1 *= Table1.Col1

上述查询通常会产生:

1   1   1       Alice
2   2   2       Bob
3   3   Null    Null
4   4   Null    Null

现在试试:

Select 
From Table1, Table2
Where Table2.Col1 *= Table1.Col1
    And Table2.Name = 'Alice'

在某些数据库产品上,您会得到:

1   1   1       Alice

你会得到其他人:

1   1   1       Alice
2   2   Null    Null
3   3   Null    Null
4   4   Null    Null

简而言之,对于未保留表的过滤是否应该在连接之前或之后应用是模棱两可的。

【讨论】:

我喜欢去掉 INNER 和 OUTER;太多的绒毛。在我使用*==*(还有一些)进行编程的所有岁月中,我认为由于模棱两可,我不得不重新编写一两个查询。即便如此,我还是更喜欢新语法。 是的。 Oracle 使用可恶的 omega-join (+) 语法:SELECT a,b,c FROM q,r where qx​​ = ry(+) should be SELECT a,b,c FROM q LEFT JOIN r on qx = ry【参考方案3】:

我相信这是 ANSI 标准。当省略 ON 关键字时,它应该返回错误,并且 (IMO) 是一种更具声明性的样式。

【讨论】:

【参考方案4】:

当它成为可能时,它变得可取......

join 关键字更好地描述了“经典”连接的意图。此外,当您在查询中有多个联接时,要联接的表和要使用的条件会彼此相邻出现,而不是将所有表放在一个位置,而将所有条件放在另一个位置。

【讨论】:

【参考方案5】:

当添加新语法以处理与外部连接实现的不一致时,它变得可取。

由于在许多情况下将外部和内部联接(以及两个方向的特定外部联接)与旧语法结合起来是模棱两可的,因此必须创建和实施新语法,以使程序员能够 100% 清楚地了解排序和分组的连接子句。

然而,自己编写旧式内连接仍然是完全合法的,但旧式外连接正在以各种形式消失,而且很好摆脱。

【讨论】:

以上是关于对于 SQL,啥时候开始需要始终使用“Inner Join”而不是隐式连接?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该使用 CROSS APPLY 而不是 INNER JOIN?

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Codin

SQL中的INNER JOIN和JOIN有啥区别

sql 的并集UNION和内联结INNER JOIN 有啥区别?感觉结果是一样的。

oracle sql中的join关键字和inner join关键字有啥区别? [复制]

关于SQL数据库中cross join 和inner join用法上的区别?