对于 SQL,什么时候开始需要始终使用“内部连接”而不是通过以下方式隐式连接:
select * from t1, t2 where t1.ID = t2.ID;
? 只是为了风格还是为了区分外部连接还是有其他原因?
对于 SQL,什么时候开始需要始终使用“内部连接”而不是通过以下方式隐式连接:
select * from t1, t2 where t1.ID = t2.ID;
? 只是为了风格还是为了区分外部连接还是有其他原因?
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
简而言之,对于未保留表上的过滤应该在连接之前还是之后应用是模棱两可的。
当添加新语法以处理与外部连接实现的不一致时,它变得可取。
由于在许多情况下将外部和内部联接(以及两个方向的特定外部联接)与旧语法结合起来是模棱两可的,因此必须创建和实施新语法以使程序员能够 100% 清楚联接的排序和分组条款。
然而,自己编写旧式内连接仍然是完全合法的,但旧式外连接正在以各种形式消失,而且很好摆脱。
当它成为可能时,它变得可取......
join
关键字更好地描述了“经典”连接的意图。此外,当您在查询中有许多联接时,要联接的表和要使用的条件会彼此相邻出现,而不是将所有表放在一个位置,而将所有条件放在另一个位置。
我相信这是ANSI标准。当 ON 关键字被省略时,它应该返回一个错误,并且 (IMO) 是一种更具声明性的样式。
ansi-92 标准 嗯,那是一个很难的,我要四肢走出来猜 1992