Использование WHERE или ON для фильтрации

#mysql #sql

#mysql #sql

Вопрос:

Пример A

 SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.key = table2.key
WHERE table2.key IS NULL;
 

Пример B

 SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.key = table2.key AND table2.key IS NULL;
 

Будут ли два приведенных выше SQL-запроса логически эквивалентны или в чем смысл фильтрации внутри ON ?

Ответ №1:

Условие Example1 WHERE clause фильтрует конечный результат, поэтому ваш example1 возвращает данные, table1 для которых совпадающие данные отсутствуют в table2 as left join на основе key , и после этого where условие фильтрует все записи, которые не имеют соответствия key в table2 вы найдете меньше или равно общей table1 записи в результате

Example2 — Условие в ON используется для объединения двух таблиц, поэтому ваш example2 предоставит вам все данные table1 и только совпадающие данные table2 . Но поскольку вы использовали конфликтующее условие в ON предложении ( ON table1.key = table2.key AND table2.key IS NULL ), ваш example2 вернет все данные для table1 и никаких данных для table2 ( null во всех столбцах для table2) — конечный результат будет иметь количество записей, равное количеству записей в table1 .

Ответ №2:

Пример B ни к чему не присоединится, потому что предложение ON всегда будет FALSE .

Итак, технически ваш пример B равен:

 SELECT my_column
FROM table1
 

Когда пример A вернет все записи из таблицы A, которые не имеют совпадающих записей в таблице B.

https://www.db-fiddle.com/f/jtCfu3ti1Rd3VDUB69iquF/0