SQL-вопросы на собеседовании аналитика данных
SQL·junior

Какие виды 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 — нет.

Потренируй этот вопрос с ИИ-интервьюером

Читать разбор полезно, а отвечать вслух под давлением — совсем другое. ИИ-интервьюер задаст этот и смежные вопросы, будет копать глубже и разберёт твои ответы. Первое короткое интервью — бесплатно.

Пройти собеседование бесплатно

Смежные вопросы