Какие виды JOIN бывают и чем они отличаются?
Короткий ответ
INNER возвращает только совпавшие строки. LEFT добавляет все строки левой таблицы (нет пары — NULL справа), RIGHT — то же для правой. FULL берёт всё из обеих. CROSS — декартово произведение, каждая с каждой. По умолчанию нужен INNER; LEFT — когда важно не потерять строки основной таблицы.
Вопрос-разминка почти на любом собеседовании аналитика. Кажется простым, но на нём легко засыпаться: одно дело перечислить типы, другое — объяснить, какие строки останутся, а какие пропадут.
Как рассуждать
JOIN — это способ склеить две таблицы по условию. Ключевой вопрос всегда один: что делать со строками, у которых нет пары в другой таблице? От ответа и зависит тип.
- INNER оставляет только те строки, где пара нашлась в обеих таблицах.
- LEFT оставляет все строки левой таблицы, а недостающие поля правой заполняет NULL.
- RIGHT — зеркально: все строки правой.
- FULL — всё из обеих, пары нет — с обеих сторон NULL.
- CROSS соединяет каждую строку с каждой без условия (декартово произведение).
Держи в голове картинку с кругами (диаграмма Венна): INNER — пересечение, LEFT — левый круг целиком.
Эталонный ответ
Начни с определения и сразу переходи к тому, чем они отличаются по строкам. Разберём на связке «фильмы и их категории».
INNER — только фильмы, у которых есть категория:
SELECT f.title, c.name
FROM film f
JOIN film_category fc ON fc.film_id = f.film_id
JOIN category c ON c.category_id = fc.category_id;
LEFT — все фильмы, даже без категории (у таких name будет NULL):
SELECT f.title, c.name
FROM film f
LEFT JOIN film_category fc ON fc.film_id = f.film_id
LEFT JOIN category c ON c.category_id = fc.category_id;
RIGHT встречается редко — обычно его переписывают в LEFT, поменяв таблицы местами, так читается проще. FULL JOIN нужен, когда важно увидеть «сирот» с обеих сторон: например, сверить два справочника и найти записи, которых нет в одном из них. CROSS JOIN пригождается, когда нужно построить решётку — скажем, все комбинации категорий и тарифов, чтобы потом посчитать по ним статистику.
Дополнительный балл — упомянуть, что тип JOIN влияет на количество строк в результате и что LEFT JOIN с последующим WHERE c.name IS NULL — классический приём «найти строки без пары».
Частые ошибки
- Путают LEFT и RIGHT под давлением. Проще запомнить: слева от слова JOIN — «главная» таблица, её строки LEFT сохраняет полностью.
- Пишут условие фильтра правой таблицы в WHERE после LEFT JOIN и удивляются, что он превратился в INNER: NULL не проходит проверку, и «сироты» отваливаются. Такое условие — в
ON. Подробнее в разборе, может ли LEFT JOIN вернуть больше строк. - Называют CROSS JOIN «ошибкой» — а он бывает нужен осознанно. Ошибка — это случайный декартов взрыв из-за забытого условия соединения.
- Забывают, что INNER JOIN симметричен по строкам (порядок таблиц не меняет набор), а LEFT/RIGHT — нет.
Потренируй этот вопрос с ИИ-интервьюером
Читать разбор полезно, а отвечать вслух под давлением — совсем другое. ИИ-интервьюер задаст этот и смежные вопросы, будет копать глубже и разберёт твои ответы. Первое короткое интервью — бесплатно.
Пройти собеседование бесплатно