4

在 JOIN 子句或 WHERE 子句中有 SQL 条件更好吗?SQL 引擎是否针对任何一种方式进行了优化?它取决于发动机吗?

是否总是可以用 WHERE 子句中的条件替换 JOIN 子句中的条件?

这里的例子来说明我对条件的意思

SELECT      role_.name
FROM        user_role
INNER JOIN  user ON user_role.user_id_ = user.id AND
                    user_role.user_id_ = @user_id
INNER JOIN  role ON user_role.role_id = role_.id

对比

SELECT      role_.name
FROM        user_role
INNER JOIN  user ON user_role.user_id_ = user.id
INNER JOIN  role ON user_role.role_id = role_.id
WHERE       user.id = @user_id
4

3 回答 3

7

如果使用 INNER JOIN,则 JOIN 子句中的 SQL 条件和 WHERE 条件中的 SQL 条件是等效的。

否则,如果使用任何其他 JOIN(如 LEFT/RIGHT)而不是在基于条件匹配行之后,则会发生另一个步骤,即添加 OUTER ROWS,即不匹配的行。

WHERE 条件只是过滤掉所有不匹配的行。

看到这个线程

于 2013-05-05T05:46:46.777 回答
4

在 join 子句中包含非键条件不仅可以,尤其是在此查询中更可取,因为您可以避免与其他表的某些连接,这些连接进一步连接到 on 子句所属的表。

Where 子句在所有连接完成进行评估- 它是结果集的过滤器。但是通过将条件放在 join 子句中,您可以在它们被连接时停止被连接的行。

在您的情况下,这没有什么区别,因为您没有任何下表,但我经常使用他的技术来提高查询的性能。

于 2013-05-05T05:52:05.437 回答
1

通过查看为这两个查询生成的计划,我们可以看到在 INNER JOIN 或 WHERE 子句中具有条件会生成相同的计划。

但是在 WHERE 子句中使用条件的问题是您将无法处理 OUTER JOIN

于 2013-05-05T07:51:28.977 回答