对于 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 的并集UNION和内联结INNER JOIN 有啥区别?感觉结果是一样的。