(在oracle中)在性能上有区别吗

Select * from Table1 T1 
Inner Join Table2 T2 On T1.ID = T2.ID

And

Select * from Table1 T1, Table2 T2 
Where T1.ID = T2.ID

?


当前回答

它们都是做同样事情的内部连接,一个只是使用更新的ANSI语法。

其他回答

我不了解Oracle,但我知道旧的语法在SQL Server中被弃用了,最终会消失。在我在新的查询中使用旧语法之前,我会检查Oracle计划用它做什么。

我更喜欢更新的语法,而不是将连接标准与其他所需的where条件混合在一起。在新的语法中,创建连接的内容和应用的其他条件更加清晰。在这样的短查询中并不是一个大问题,但是当您有一个更复杂的查询时,它会变得更加混乱。由于人们学习基本的查询,我倾向于让人们在复杂查询中使用连接语法之前先学习使用它。

再次,我不知道Oracle,但我知道SQL Server版本的旧风格左连接是有缺陷的,甚至在SQL Server 2000,并给出不一致的结果(有时左连接有时交叉连接),所以它不应该被使用。希望Oracle不会遇到同样的问题,但可以肯定的是,左右连接在旧语法中很难正确表达。

另外,根据我的经验(当然,这完全是个人观点,你可能有不同的经验),使用ansi标准连接的开发人员倾向于更好地理解连接是什么以及它在从数据库中获取数据方面的意义。我相信这是因为大多数对数据库有良好理解的人倾向于编写更复杂的查询,而在我看来,使用ANSII标准比旧风格更容易维护。

除了这个好答案,我还有一个补充:

这就是分别定义为SQL92和SQL89的内容,它们之间没有性能差异,尽管可以省略INNER这个词(只使用JOIN就足够清楚了,在最简单的查询中保存了5个键盘笔画,现在想象一下在大的查询中有多少笔画)。

如果查询优化器的工作是正确的,那么这些查询之间应该没有区别。它们只是指定相同期望结果的两种方法。

在表采用第三范式的场景中,表之间的连接不应该改变。即加入客户和付款应始终保持不变。

但是,我们应该将连接与过滤器区分开来。联接是关于关系的,而过滤器是关于划分整体的。

一些作者,参考标准(即吉姆梅尔顿;艾伦·r·西蒙(1993)。理解新的SQL:完整指南。摩根考夫曼。11 - 12页。ISBN 978-1-55860-245-8.)写了在FROM子句中采用JOIN语法而不是逗号分隔表的好处。

我完全同意这个观点。

有几种方法可以编写SQL并达到相同的结果,但对于许多进行团队工作的人来说,源代码的可读性是一个重要方面,当然,从澄清源代码的意义上讲,将表之间的关系从特定的过滤器中分离出来是一个巨大的飞跃。

不要忘记在Oracle中,如果连接键属性在两个表中命名相同,你也可以这样写:

select *
from Table1 inner join Table2 using (ID);

当然,这也有相同的查询计划。