2014-10-20 104 views
0

我注意到的是,形式的查询是FROM x JOIN y ON x.a = y.b相当于FROM x,y WHERE x.a = y.b?

SELECT * 
FROM a 
JOIN b ON a.x = b.y 
WHERE [more conditions...]; 

分别为形式

SELECT * 
FROM a,b 
WHERE a.x = b.y 
AND [more conditions...]; 

直觉,他们似乎等同的查询返回相同的数据的一些测试数据,但我不相信这是这样的。

我更喜欢使用JOIN的查询,因为它将查询的通用结构与查询的特定业务逻辑分开。即,使用JOIN的查询的WHERE部分中的条件是可以参数化的条件。

在哪些其他方式,如果有的话,这些查询是不是完全相同?

+0

什么是数据库平台? – 2014-10-20 15:11:49

+2

这可能会帮助你http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins – 2014-10-20 15:12:19

+0

是的,在大多数RDBMSs中,它们不仅会返回相同的记录,而且会具有完全相同的执行路径好。 – JNevill 2014-10-20 15:13:27

回答

1

这两种形式是等价的,但另一个原因

SELECT * 
FROM a 
JOIN b ON a.x = b.y 
WHERE [more conditions...]; 

往往是首选的是,它提供了更多的灵活性,如果你需要一个稍微不同的过滤器的东西。想象一下,例如,x可能是null。您只需将加入类型更改为left join即可。

1

这些查询在逻辑上是相同的。新的JOIN表单(SQL-92)和较早的,表单之间的逻辑差异在于外连接表达式如何工作。

它们不相同的地方在于代码质量。 SQL-89表单在20多年前被SQL-92所取代,而新的表单更清晰,外部联接的标准更好,外部联接的表达能力更强。

0

是的,这两种方式的功能类似,根据书籍:数据库系统基础/ Ramez Elmasri,Shamkant B. Navathe。 Online book link

1

一般答案是肯定的。

但是,您必须考虑到,随着您的SQL语句的复杂性,解析它们并确定它们在数据库中的执行计划的复杂性将会增加,从而使ANSI风格的联接和常规联接更可能没有相同的执行计划,性能和输出。

这在Oracle中确实是这样,它在ANSI连接解析中仍然存在一些严重的错误(在Oracle支持时有一些悬而未决的错误)。

相关问题