5

对于 SQL,什么时候开始需要始终使用“内部连接”而不是通过以下方式隐式连接:

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

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

4

5 回答 5

3

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

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

于 2010-04-24T23:14:53.383 回答
2

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

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

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

于 2010-04-24T23:07:11.417 回答
0

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

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

于 2010-04-24T23:26:29.860 回答
0

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

于 2010-04-24T23:29:17.973 回答
0

ansi-92 标准 嗯,那是一个很难的,我要四肢走出来猜 1992

于 2010-04-25T08:23:41.967 回答