可能重复:
显式与隐式 SQL 连接
Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)
Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>
我不确定第二个语句是否可以提供较小的结果集。如果 B 中有几行与 A 中的一行匹配,我们是否可以通过第二条语句获得所有这些匹配?
可能重复:
显式与隐式 SQL 连接
Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)
Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>
我不确定第二个语句是否可以提供较小的结果集。如果 B 中有几行与 A 中的一行匹配,我们是否可以通过第二条语句获得所有这些匹配?
最后的结果是,是的。关于执行:查询优化器最终可能会为两个查询创建相同的查询执行计划。
如果根据其近似统计数据(例如,近似等深度直方图 - 顺便说一下,它们并非一直都是最新的),优化器将确定第一个连接比第二个,因此,它将首先执行这个。
Stmt1 允许您指定连接的顺序,并且考虑到您确切知道表包含什么,这可能是一个更好的解决方案。
从语义上讲,查询将是相同的。然而,试图依靠计划来证明这一点并不是一个好主意。
也可以随意插入,<cond1>
这样<cond2>
查询在第二种形式中是有效的,但在第一种形式中是不合法的。
从这个意义上说,第二个更一般,但只要第一个好,那么第二个就是等效的。