正如西蒙所指出的,性能差异应该可以忽略不计。主要关注的是确保您的查询正确表达您的意图,并且(尤其是)您获得预期的结果。
通常,只有当过滤器是join 的条件时,您才希望将过滤器添加到 JOIN 子句。在大多数(不是所有)情况下,应将过滤器应用于 WHERE 子句,因为它是整个查询的过滤器,而不是连接本身的过滤器。
AFAIK,唯一真正影响查询结果的实例是使用 OUTER JOIN 时。
考虑以下查询:
SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE o.OrderType = "InternetOrder"
对比
SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId AND o.OrderType = "InternetOrder"
第一个将为每个订单类型为“Internet Order”的客户订单返回一行。实际上,由于应用于整个查询的过滤器,您的左连接已成为内连接(即根本不会返回没有“InternetOrder”的客户)。
第二个将为每个客户返回至少一行。如果客户没有订单类型为“Internet Order”的订单,它将为所有订单表字段返回空值。否则,它将为每个“互联网订单”类型的客户订单返回一行。