Условие
Может ли измениться результат запроса, если в LEFT JOIN поменять таблицы местами?
-- Было
SELECT * FROM A LEFT JOIN B ON A.id = B.a_id;
-- Стало
SELECT * FROM B LEFT JOIN A ON A.id = B.a_id;Решение
Да, результат изменится — порядок таблиц в LEFT JOIN важен.
LEFT JOIN означает: «верни все строки левой таблицы, и для них — совпадения из правой; если совпадения нет — NULL в полях правой».
При перестановке таблиц местами «ведущей» становится другая таблица. Если в A есть строки без пары в B, в первом запросе они окажутся с NULL в полях B. Во втором запросе ведущая — B, и эти строки A просто не попадут в результат, зато попадут все строки B (даже без пары в A).
Эквивалентно эту перестановку можно записать как A RIGHT JOIN B — это тождественно B LEFT JOIN A.
Когда результат не изменится
Только если соответствие строго взаимно-однозначное и без «висячих» строк в обеих таблицах — тогда LEFT JOIN, RIGHT JOIN и INNER JOIN дают одинаковое множество строк. Но это редкий и особый случай.
Подводные камни
- Считать, что
LEFT JOINсимметричен. Это асимметричная операция, ведущая всегда левая. - Путать с
INNER JOIN. УINNER JOINперестановка таблиц местами действительно не меняет результат (с точностью до порядка столбцов в*). - Считать, что
LEFT JOIN A B = RIGHT JOIN B A. Правильно:A LEFT JOIN B = B RIGHT JOIN A.
Эталонный ответ
Да, результат изменится (если только во второй таблице нет строк без пары в первой).