您好:)我对MySQL查询有疑问。哪个更快,为什么?有什么区别吗?
select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk
WHERE tab2.somevalue = 'value'
或者这个:
select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk
AND tab2.somevalue = 'value'
正如西蒙(Simon)所指出的,性能差异应该可以忽略不计。主要要考虑的是确保您的查询正确表达了您的意图,并且(特别是)您获得了预期的结果。
通常,仅当过滤器是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订单”的每个客户订单返回一行。实际上,由于已将过滤器应用于整个查询,因此您的左联接已成为内部联接(即,根本不会返回没有“ InternetOrder”的客户)。
第二个将为每个客户返回至少一行。如果客户没有订单类型为“ Internet Order”的订单,则它将为所有订单表字段返回空值。否则,它将为“ Internet Order”类型的每个客户订单返回一行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句