我有以下两个例子。
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.