#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.