FROM x JOIN y ON x.a = y.b相当于FROM x,y WHERE x.a = y.b?

时间:2014-10-20 15:09:46

标签: sql performance join syntactic-sugar equivalent

我在一些测试数据中发现了表单

的查询
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的查询,因为它将查询的一般结构与查询的特定业务逻辑分开。即使用WHERE的查询的JOIN部分中的条件是可以参数化的条件。

这些查询在哪些其他方式(如果有)不相同?

4 个答案:

答案 0 :(得分:1)

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

它们不相同的地方是代码质量。 SQL-89的形式在20多年前被SQL-92超越,而且更新的形式因其清晰度,外部连接的更好标准采用和外部连接的更强表现力而备受青睐。

答案 1 :(得分:1)

一般的答案是肯定的。

但是,您必须考虑到SQL语句的复杂性,解析它们并确定它们在数据库中的执行计划的复杂性将会增加,使得ANSI样式连接和常规连接更有可能没有相同的执行计划,绩效和产出。

在Oracle中肯定是这种情况,它在ANSI连接解析中仍存在一些严重的错误(在Oracle支持下有一些漏洞待定)。

答案 2 :(得分:1)

两种形式都是等同的,但另一个原因是

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

通常首选的是,如果您需要以不同的方式过滤事物,它会提供更大的灵活性。想象一下,例如x可能是null。您只需将联接类型更改为left join

答案 3 :(得分:0)

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