条件是JOIN子句中的恶SQL

时间:2013-05-05 05:42:18

标签: mysql sql sql-server join

在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

VS

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

3 个答案:

答案 0 :(得分:7)

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

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

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

See this thread

答案 1 :(得分:4)

在join子句中使用非键条件不仅好,特别是在此查询中更好,因为您可以避免与进一步连接到on子句所属的表的其他表的某些连接。 / p> 在完成所有连接之后, 评估Where子句 - 它是结果集上的过滤器。但是通过将条件放在join子句中,您可以在他们加入时停止正在连接的行。

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

答案 2 :(得分:1)

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

但是在WHERE子句中使用条件的问题是你无法处理OUTER JOINs