Ответ 1
Как правило, любая СУБД (например, SQL) будет выполнять свою оптимизацию запросов, которая использует алгоритм, который, по его мнению, является самым быстрым. Поэтому он фильтрует, а затем присоединяется.
У меня есть запрос, в котором я использую 13 LEFT OUTER JOINS. Самая левая таблица имеет большие данные, поэтому для выполнения запроса и возврата результата требуется очень много времени. Но когда я использую предложение where для фильтрации результата, это занимает очень мало времени. Теперь я запутался в том, что выполняется в первую очередь: объединения, которые производят результат, а затем, где от него фильтруется условие ИЛИ сначала он фильтрует результат, принимает соединение результата.
Как правило, любая СУБД (например, SQL) будет выполнять свою оптимизацию запросов, которая использует алгоритм, который, по его мнению, является самым быстрым. Поэтому он фильтрует, а затем присоединяется.
Читайте: , который запускается первым при выполнении запроса WHERE CLAUSE илиJOIN CLAUSE?
и
Я пишу пост Pinal Dave, и я нашел это, это migh talso поможет вам понять
понимать предложение ON, которое применяется перед JOIN, поэтому он извлекает весь результат таблицы2, где есть флаг = 1, но он не влияет на таблицу 1, поэтому он извлекает все строки таблицы1. Когда применяется предложение WHERE, оно применяется к полному результату, поэтому оно удаляет все строки из Таблицы 1 и Таблицы 2, где Флаг не равен 1, по существу сохраняя флаг = 1 строки из Таблицы 1 и Таблицы 2.
Скопировано из моего предыдущего ответа
create table A(id int);
create table B(id int);
INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);
INSERT INTO B VALUES(1);
INSERT INTO B VALUES(2);
INSERT INTO B VALUES(3);
SELECT * FROM A;
SELECT * FROM B;
id
-----------
1
2
3
id
-----------
1
2
3
Фильтр в JOIN для предотвращения добавления строк во время процесса JOIN.
select a.*,b.*
from A a left join B b
on a.id =b.id and a.id=2;
id id
----------- -----------
1 NULL
2 2
3 NULL
WHERE будет фильтроваться после того, как произошел JOIN.
select a.*,b.*
from A a left join B b
on a.id =b.id
where a.id=2;
id id
----------- -----------
2 2