我有以下两个例子。
1。示例(WHERE)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE t2.field = true
2。示例(加入AND)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id AND t2.field = true
性能方面的更快方式是什么?你更喜欢什么?
答案 0 :(得分:17)
如果过滤器在功能上进入JOIN
条件(即它是实际的连接条件,而不仅仅是过滤器),它必须出现在该连接的ON
子句中。
值得注意的是:
如果您将其放在WHERE
子句中,如果连接为INNER
,则性能相同,否则它们会有所不同。正如评论中所提到的那样,无论如何结果并不重要。
当WHERE
子句确实是OUTER JOIN
条件时,将过滤器置于OUTER
子句中会明显取消条件的... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5
性质(即使没有记录也会加入) )因为这些过滤器意味着必须首先存在现有记录。示例:
... table1 t LEFT JOIN table2 u ON ...
WHERE t2.column = 5
是正确的
t2.column = 5
不正确,因为IS NULL
告诉引擎来自t2的记录是预期的,这与外部联接相反。例外情况是WHERE t2.column IS (NOT) NULL
过滤器,例如LEFT
(这实际上是构建条件外连接的便捷方式)
RIGHT
和OUTER
加入是隐含的{{1}}加入。希望它有所帮助。
答案 1 :(得分:6)
JOIN
条件通常应独立于过滤条件。您可以使用ON
定义加入规则(如何)。您可以使用WHERE
过滤所需的 。性能方面,所有引擎和设计都没有一般规则,因此您的里程会有很大差异。
答案 2 :(得分:0)
我认为更快的方法是将过滤器放在where子句中,因为它将首先在where中进行过滤,然后是join子句,因此不需要对过滤器进行排列。