与WHERE子句相反,在连接中进行过滤是否有性能明智?
例如,
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
AND b.deleted = 0
WHERE a.field = 5
与
相反SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
WHERE a.field = 5
AND b.deleted = 0
我个人更喜欢后者,因为我觉得过滤应该在过滤部分(WHERE)中完成,但是有任何性能或其他原因要做任何一种方法吗?
答案 0 :(得分:25)
如果查询优化器完成其工作,则内部连接的两种形式完全没有区别(除了其他人的清晰度)。
也就是说,对于左连接,连接中的条件意味着在连接之前从第二个表中过滤行。 where中的条件意味着在加入后从最终结果中过滤行。那些意味着非常不同的东西。
答案 1 :(得分:1)
我认为这就是你要找的>> SQL join: where clause vs. on clause
答案 2 :(得分:0)
这两者之间没有区别,因为在查询的逻辑处理中,WHERE
将始终在filter子句(ON)之后,在您的示例中,您将拥有:
您的示例采用ANSI SQL-92标准,您也可以使用ANSI SQL-89标准编写查询,如下所示:
SELECT blah FROM TableA a,TableB b
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5
对于内部联合而言这是正确的,外部联接类似但不是相同的
答案 3 :(得分:0)
使用内部联接,您将获得相同的结果,并且可能具有相同的性能。但是,对于外连接,两个查询将返回不同的结果并且根本不相等,因为将条件放在where子句中实质上将查询从左连接更改为内连接(除非您正在查找某些记录field为null)。