SQL JOIN在何处放置WHERE条件?

时间:2013-03-18 18:06:49

标签: sql join where

我有以下两个例子。

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

性能方面的更快方式是什么?你更喜欢什么?

3 个答案:

答案 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(这实际上是构建条件外连接的便捷方式)

  • RIGHTOUTER加入是隐含的{{1}}加入。

希望它有所帮助。

答案 1 :(得分:6)

JOIN条件通常应独立于过滤条件。您可以使用ON定义加入规则(如何)。您可以使用WHERE过滤所需的 。性能方面,所有引擎和设计都没有一般规则,因此您的里程会有很大差异。

答案 2 :(得分:0)

我认为更快的方法是将过滤器放在where子句中,因为它将首先在where中进行过滤,然后是join子句,因此不需要对过滤器进行排列。