0Pricing
Coding Interview Prep · Урок

Выбор правильного типа объединения

Освойте алгоритм выбора подходящего JOIN по условию задачи.

«Выбор правильного типа объединения» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Выбор соединения по условию задачи

Наиболее ценный навык при выборе соединения на собеседовании — не синтаксис, а перевод требования, сформулированного обычным языком, в правильный тип соединения. Большинство кандидатов знают, как работает каждый тип соединения, но теряются, когда под давлением нужно выбрать один из них.

Этот урок даёт Вам универсальную схему принятия решений, чтобы Вы могли за несколько секунд назвать подходящий тип соединения.

Главный вопрос: какие строки должны сохраниться

Любой выбор соединения сводится к одному вопросу: какие несовпавшие строки с каждой стороны нужно сохранить?

  • Сохранить только совпавшие строки с обеих сторон: INNER JOIN.
  • Сохранить все строки слева, независимо от наличия совпадения: LEFT JOIN.
  • Сохранить все строки с обеих сторон: FULL OUTER JOIN.
  • Сохранить все комбинации: CROSS JOIN.

Сначала определите, что должно сохраниться, — тип соединения последует автоматически.

Слова-подсказки для INNER JOIN

Фразы вроде «клиенты, разместившие заказ», «товары, у которых есть отзывы» или «заказы вместе с их клиентами» означают, что совпадение должно существовать с обеих сторон. Это INNER JOIN.

Если отбрасывать несовпавшие строки допустимо или желательно, INNER JOIN является вариантом по умолчанию и самым эффективным выбором.

SELECT c.name, o.order_id
FROM customers c
JOIN orders o ON o.customer_id = c.id;

Слова-подсказки для LEFT JOIN

Фразы вроде «все клиенты, включая тех, у кого нет заказов» или «вывести каждый товар и количество его отзывов (ноль, если отзывов нет)» означают, что нужно сохранить левую таблицу независимо от совпадений. Это LEFT JOIN.

Подсказками служат слова «все», «включая тех, у кого нет» и «даже если ничего нет».

SELECT c.name, COUNT(o.order_id) AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name;

Слова-подсказки для антисоединения

Фразы вроде «клиенты, которые никогда не размещали заказов», «товары без продаж» или «сотрудники без руководителя» требуют найти строки, для которых нет совпадения. Это антисоединение: LEFT JOIN плюс WHERE right_key IS NULL (или NOT EXISTS).

Ключевые слова — «никогда», «нет» и «без».

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_id IS NULL;

Слова-подсказки для FULL OUTER JOIN

Фразы вроде «сопоставить два списка и показать записи, отсутствующие с любой стороны» или «сравнить счета за прошлый и текущий месяц, отметив как новые, так и исчезнувшие» требуют сохранить несовпавшие строки из обеих таблиц. Это FULL OUTER JOIN.

Типичные примеры — задачи на сверку и поиск различий.

SELECT a.id, b.id
FROM last_month a
FULL OUTER JOIN this_month b ON a.id = b.id
WHERE a.id IS NULL OR b.id IS NULL;

Слова-подсказки для CROSS JOIN

Фразы вроде «каждый размер в каждом цвете», «по одной строке на каждый магазин и день, даже если продаж не было» или «все возможные комбинации» указывают на CROSS JOIN.

Подсказкой служат выражения «каждый ... в каждом» и «все комбинации», когда между двумя наборами нет условия совпадения.

SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;

Слова-подсказки для SELF JOIN

Фразы, связывающие строку с другой строкой в той же таблице, например «каждый сотрудник и его руководитель», «пары пользователей из одного города» или «найти дубликаты адресов электронной почты», указывают на SELF JOIN.

Подсказка состоит в том, что одна сущность ссылается на другую сущность того же типа или сравнивается с ней.

SELECT e.name, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

Разбор примера перевода условия в запрос

Условие: «Показать каждый товар и количество его заказов за прошлый месяц, включая товары, которые никогда не заказывали».

Разберём его: слова «каждый товар» и «включая товары, которые никогда не заказывали» означают, что нужно сохранить все строки товаров. Поэтому соединяем товары с заказами с помощью LEFT JOIN, а затем считаем строки со стороны заказов через COUNT (для товаров без совпадений получится 0, поскольку COUNT игнорирует NULL).

SELECT p.name, COUNT(o.order_id) AS times_ordered
FROM products p
LEFT JOIN orders o
  ON o.product_id = p.id
 AND o.order_date >= DATE '2024-05-01'
GROUP BY p.id, p.name;

Распространённая ошибка: фильтр в ON и WHERE

В предыдущем запросе фильтр по дате находится в предложении ON, а не в WHERE. Благодаря этому сохраняются товары без подходящих заказов.

Если перенести order_date >= ... в WHERE, строки NULL у товаров без совпадений будут отброшены, и LEFT JOIN незаметно превратится в INNER JOIN. В результате исчезнут именно те товары, которые требовалось сохранить.

-- WRONG: WHERE on the outer table removes unmatched products
-- ...
-- LEFT JOIN orders o ON o.product_id = p.id
-- WHERE o.order_date >= '2024-05-01'  <-- becomes an inner join

Схема принятия решения

Пропускайте любую задачу на выбор соединения через этот список:

  • Та же таблица связана сама с собой? → SELF JOIN (а если глубина не ограничена, рассмотрите рекурсивный CTE).
  • Нужны все комбинации без условия? → CROSS JOIN.
  • Нужны только совпавшие строки? → INNER JOIN.
  • Нужно сохранить все строки с одной стороны? → LEFT JOIN.
  • Нужно сохранить несовпавшие строки с обеих сторон? → FULL OUTER JOIN.
  • Нужны строки без совпадения? → антисоединение (LEFT JOIN + IS NULL).

Быстрая проверка

Примените эту схему к задаче, сформулированной словами.

Итоги: выбор правильного типа соединения

Главные выводы:

  • Начинайте каждый выбор соединения с вопроса: какие несовпавшие строки должны сохраниться.
  • Используйте слова-подсказки: «все/включая» → LEFT, «никогда/нет» → антисоединение, «каждый ... в каждом» → CROSS, «каждый X и его X» → SELF, сверка → FULL OUTER.
  • Фильтры внешнего соединения размещайте в предложении ON; фильтр в WHERE может незаметно превратить LEFT JOIN в INNER JOIN.
  • Проговаривайте эту схему на собеседованиях: так Вы показываете ход рассуждений, а не заученные правила.

Часто задаваемые вопросы

Урок «Выбор правильного типа объединения» бесплатный?

Да — полный текст урока «Выбор правильного типа объединения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Выбор правильного типа объединения»?

Освойте алгоритм выбора подходящего JOIN по условию задачи. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Выбор правильного типа объединения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. CROSS JOIN и декартовы произведения
  2. SELF JOIN для иерархий
  3. Сравнение строк внутри одной таблицы
  4. Выбор правильного типа объединения
← Назад к Coding Interview Prep