我在一些测试数据中发现了表单
的查询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
部分中的条件是可以参数化的条件。
这些查询在哪些其他方式(如果有)不相同?
答案 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