在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
答案 0 :(得分:7)
如果使用INNER JOIN,JOIN子句和WHERE条件中的SQL条件是等效的。
否则,如果使用任何其他JOIN(如LEFT / RIGHT)而不是基于条件匹配行,则会发生另一个步骤,即添加OUTER ROWS,即非匹配行。
WHERE条件只过滤掉所有不匹配的行。
答案 1 :(得分:4)
在join子句中使用非键条件不仅好,特别是在此查询中更好,因为您可以避免与进一步连接到on子句所属的表的其他表的某些连接。 / p> 在完成所有连接之后, 评估Where子句 - 它是结果集上的过滤器。但是通过将条件放在join子句中,您可以在他们加入时停止正在连接的行。
在你的情况下它没有任何区别,因为你没有任何下面的表,但我经常使用他的技术来提高我的查询性能。
答案 2 :(得分:1)
通过查看为两个查询生成的计划,我们可以看到在INNER JOIN或WHERE子句中具有条件会生成相同的计划。
但是在WHERE子句中使用条件的问题是你无法处理OUTER JOINs