Смысл 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 — локальная установка не требуется.
Все уроки этого курса
- LEFT JOIN и сохранение несовпавших строк
- Смысл RIGHT и FULL OUTER JOIN
- Поиск строк без совпадений (антиобъединение)
- Ловушка WHERE при внешнем объединении