Как писать SQL запросы с использованием join
Что проверяют
Понимаете ли вы разницу между видами соединений и знаете ли ловушку с условием в WHERE вместо ON.
Как отвечать
Соединение связывает строки таблиц по условию:
select e.name, d.title
from employees e
join departments d on d.id = e.department_id
where e.is_active;Виды и когда какой:
INNER JOIN: только совпавшие строки. Сотрудник без отдела в результат не попадёт;LEFT JOIN: все строки левой таблицы, а недостающие поля правой заполняются пустыми значениями. Нужен, когда важно показать всех, включая тех, у кого связи нет;RIGHT JOINэто зеркальный вариант, на практике почти не используется, потому что таблицы проще поменять местами;FULL JOIN: все строки обеих сторон;CROSS JOIN: все сочетания, обычно результат ошибки, а не намерения.
Главная ловушка, которую и проверяют: условие фильтрации правой таблицы в LEFT JOIN должно стоять в ON, а не в WHERE. В WHERE оно отбросит строки с пустыми значениями и превратит внешнее соединение во внутреннее.
Дополнительно стоит назвать: дубликаты появляются, когда справа несколько подходящих строк (соединение размножает левую сторону, и это частая причина «неожиданно выросшего» отчёта); соединять лучше по индексированным колонкам; при нескольких соединениях полезно смотреть план, потому что порядок и способ соединения выбирает планировщик.
Где спотыкаются
Ставят условие по правой таблице в WHERE и теряют строки без пары.
Не замечают размножения строк и получают завышенные суммы в агрегатах.
Соединяют по неиндексированным колонкам на больших таблицах и удивляются времени выполнения.