0Pricing
Coding Interview Prep · Урок

Смысл RIGHT и FULL OUTER JOIN

Узнайте, когда нужен каждый тип и как переписать RIGHT через LEFT.

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

Помимо LEFT JOIN

После того как вы поймёте LEFT JOIN, интервьюеры проверят его зеркальный вариант и объединение обоих подходов: RIGHT JOIN и FULL OUTER JOIN.

  • RIGHT JOIN сохраняет каждую строку правой таблицы.
  • FULL OUTER JOIN сохраняет несовпавшие строки из обеих таблиц.

В этом уроке каждый вариант определяется точно и показывается приём переписывания запроса, который любят интервьюеры: любой RIGHT JOIN можно заменить на LEFT JOIN.

Что такое RIGHT JOIN

RIGHT JOIN (или RIGHT OUTER JOIN) сохраняет каждую строку из правой таблицы — той, что записана после ключевого слова JOIN. Несовпавшие строки справа появляются со значениями NULL в столбцах левой таблицы.

Это точное зеркальное отражение LEFT JOIN. Если LEFT сохраняет первую названную таблицу, то RIGHT сохраняет вторую.

SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c
  ON o.customer_id = c.id;
-- keeps ALL customers, even those
-- with no order (Carol -> amount NULL)

Снова о таблицах

Данные те же, что и раньше. У Кэрол (клиента 3) нет заказа. Все строки заказов здесь ссылаются на существующего клиента, поэтому, когда сохраняемой стороной являются клиенты, ни один заказ не остаётся без клиента.

-- customers           orders
-- 1 | Alice           10 | 1 | 50
-- 2 | Bob             11 | 1 | 75
-- 3 | Carol           12 | 2 | 20

Как заменить RIGHT на LEFT

Главный вывод для собеседования: RIGHT JOIN редко используется на практике, поскольку порядок таблиц всегда можно изменить и использовать LEFT JOIN. Два запроса ниже логически идентичны.

Многие руководства по стилю полностью запрещают RIGHT JOIN, поскольку читать запрос слева направо и всегда сохранять левую таблицу проще.

-- RIGHT JOIN
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;

-- Equivalent LEFT JOIN (preferred)
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

Что такое FULL OUTER JOIN

FULL OUTER JOIN сохраняет несовпавшие строки из обеих таблиц. Представляйте его как объединение LEFT JOIN и RIGHT JOIN:

  • Совпавшие пары отображаются как обычно.
  • Строки слева без совпадений: столбцы справа получают значение NULL.
  • Строки справа без совпадений: столбцы слева получают значение NULL.

Он отвечает на запрос: «Покажите всё с обеих сторон, выстроив совпадения в пары».

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

Когда особенно полезен FULL OUTER JOIN

FULL OUTER JOIN — основной инструмент для сверки: сравнения двух наборов данных, которые должны совпадать, но могут различаться.

Представьте таблицу orders и отдельную таблицу payments. FULL OUTER JOIN по идентификатору заказа показывает в одном результате и заказы без платежей, и платежи без соответствующего заказа; для каждой отсутствующей стороны значения NULL указывают на отсутствие данных.

SELECT o.id AS order_id, p.id AS payment_id
FROM orders o
FULL OUTER JOIN payments p
  ON p.order_id = o.id
WHERE o.id IS NULL OR p.id IS NULL;
-- rows where one side is missing

Учет диалектов

Интервьюер может проверить переносимость решения. В MySQL нет ключевого слова FULL OUTER JOIN (вплоть до версии 8). Его поддерживают PostgreSQL, SQL Server и Oracle.

В MySQL это можно имитировать, объединив LEFT JOIN и RIGHT JOIN с помощью UNION (он удаляет дублирующиеся совпавшие строки). Знание этого различия говорит о практическом опыте.

-- FULL OUTER JOIN emulated in MySQL
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.name, o.id FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;

Четыре типа соединения: краткий обзор

Держите эту таблицу в голове. «Сохранённые» означает, что несовпавшие строки сохраняются с NULL.

  • INNER JOIN: только совпавшие строки. Ничего не сохраняется.
  • LEFT JOIN: сохраняются все строки слева.
  • RIGHT JOIN: сохраняются все строки справа.
  • FULL OUTER JOIN: сохраняются обе стороны.

Любой вопрос на собеседовании о внешних соединениях сводится к выбору стороны или сторон, которые нужно сохранить.

Как выбрать нужный тип

Выбирайте соединение, задавая вопрос: «Какие несовпавшие строки я должен сохранить?»

  • Нужно сохранить только строки основной таблицы: LEFT JOIN (поместите основную таблицу первой).
  • Нужны оба набора несовпавших строк для сверки: FULL OUTER JOIN.
  • Важны только совпадения: INNER JOIN.

Почти никогда не выбирайте RIGHT JOIN напрямую — переоформите запрос как LEFT JOIN.

Пример сверки

Задействуйте FULL OUTER JOIN, чтобы обозначить статус каждой строки. Выражение CASE по расположению NULL показывает, какая сторона отсутствует, — это классический запрос для аудита.

SELECT
  COALESCE(o.id, p.order_id) AS ord,
  CASE
    WHEN p.id IS NULL THEN 'no payment'
    WHEN o.id IS NULL THEN 'orphan payment'
    ELSE 'matched'
  END AS status
FROM orders o
FULL OUTER JOIN payments p ON p.order_id = o.id;

Распространённое заблуждение

Кандидаты часто думают, что FULL OUTER JOIN возвращает декартово произведение несовпавших строк. Это не так. Несовпавшие строки каждой стороны появляются ровно один раз, в паре с NULL, и никогда не перемножаются друг с другом.

Совпавшие строки по-прежнему подчиняются обычному умножению при соединении: одна выходная строка на каждую совпавшую пару — то же правило размножения, что и у любого соединения.

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

Интервьюер просит переписать запрос для команды, которая запрещает RIGHT JOIN.

Итоги

RIGHT JOIN сохраняет правую таблицу, а FULL OUTER JOIN — обе. Любой RIGHT JOIN можно переписать как LEFT JOIN, поменяв порядок таблиц, поэтому команды предпочитают LEFT.

  • FULL OUTER идеально подходит для сверки двух наборов данных.
  • В MySQL нет FULL OUTER; его можно имитировать с помощью LEFT + RIGHT + UNION.
  • Выбирайте соединение, решив, какие несовпавшие строки нужно сохранить.
  • Несовпавшие строки появляются один раз с NULL, а не в виде декартова произведения.

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

Урок «Смысл RIGHT и FULL OUTER JOIN» бесплатный?

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

Чему я научусь в уроке «Смысл RIGHT и FULL OUTER JOIN»?

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

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

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

Сколько времени занимает урок «Смысл RIGHT и FULL OUTER JOIN»?

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

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

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

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

  1. LEFT JOIN и сохранение несовпавших строк
  2. Смысл RIGHT и FULL OUTER JOIN
  3. Поиск строк без совпадений (антиобъединение)
  4. Ловушка WHERE при внешнем объединении
← Назад к Coding Interview Prep