Порядок операций SQL

Если я запустил следующий SQL-запрос

SELECT * FROM A LEFT JOIN B ON A.foo=B.foo WHERE A.date = "Yesterday" 

Выполняется ли WHERE до или после JOIN ?

Если после, что было бы лучшим способом написать этот оператор, чтобы только строки из A с "Yesterday" были соединены с B ?

Это зависит от базы данных.

На SQL Server запустите: SET SHOWPLAN_ALL ON затем запустите запрос, вы получите представление о том, что произойдет, когда оно запустится.

Ваша идея «оценки» неверна, поскольку SQL является декларативным языком.

Кстати, вы можете увидеть план выполнения запроса. В префиксе MySQL ваш запрос с ключевым словом describe чтобы увидеть план выполнения.

Семантически: после СОЕДИНЕНИЯ. Но в этом случае разница в времени отсутствует, потому что она находится на стороне LEFT JOIN.

Поскольку у вас уже есть это, «только строки из A с« Вчера »соединены с B».

Оптимизатор может свободно реорганизовать свой порядок операций в зависимости от эквивалентности в реляционной алгебре.

Это возвращает только A.date = «Вчера» и соединяется с B, где он может найти совпадение на foo:

 SELECT * FROM A LEFT JOIN B ON A.foo=B.foo WHERE A.date="Yesterday" 

Это возвращает все A независимо от каких-либо критериев и присоединяется к B, где A.date = «Вчера» И находит совпадение на foo:

 SELECT * FROM A LEFT JOIN B ON A.foo=B.foo AND A.date="Yesterday" 

Порядок операций для удовлетворения запроса определяется, почему прихоть оптимизатора запросов конкретной базы данных. Оптимизатор запросов пытается создать хороший «план запросов» (набор операций) на основе того, что он может извлечь из запроса и любой статистики, имеющейся у него в базе данных (которая может включать в себя мощность таблиц и некоторых распределений данных) ,

В вашем случае ответ может зависеть от того, есть ли у вас вторичный индекс на A.date

Оптимизация запросов – довольно насыщенная тема. Документация для любой базы данных, которую вы используете, будет иметь гораздо больше, чтобы сказать об этом.

Зависит от индексов и статистики.

Вы должны показать путь выполнения запроса, чтобы определить, где (если есть) оптимизация должна применяться.

в SQL Server:

Как общее правило, предложения JOIN оцениваются перед предложениями WHERE.

В случае сложных объединений, которым нужны фильтры в части соединения, я пишу их вместе с моим соединением

 SELECT * FROM A LEFT JOIN B ON A.Foo1 = B.Foo1 And A.Date = 'Yesterday' OUTER JOIN C ON B.Foo2 = C.Foo2 JOIN D ON B.Foo3 = D.Foo3 
 SELECT * FROM (SELECT * FROM A WHERE Date = 'Yesterday') A LEFT JOIN B ON A.Foo1 = B.Foo1 OUTER JOIN C ON B.Foo2 = C.Foo2 JOIN D ON B.Foo3 = D.Foo3