我有以下两个例子。
1. 示例(WHERE)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE t2.field = true
2. 示例(JOIN AND)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id AND t2.field = true
就性能而言,更快的方法是什么?你喜欢哪个?
如果一个过滤器在功能上进入一个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
告诉引擎来自 t2 的记录是预期的,这与外部连接背道而驰。例外情况是IS NULL
过滤器,例如WHERE t2.column IS (NOT) NULL
(这实际上是构建条件外连接的便捷方式)
LEFT
并且RIGHT
连接是隐式OUTER
连接。希望它有所帮助。
JOIN
条件通常应独立于过滤条件。您使用 定义您的加入规则(如何)ON
。你过滤你想要的WHERE
。就性能而言,所有发动机和设计都没有通用规则,因此您的行驶里程会有很大差异。
I think the faster way is to put the filter in the where clause, because it will procees that filter in the where first , and then the join clause, so there will be no need of permutation of filters.