Sobes.tech
Назад к вопросам
Junior — Middle
80

Чем отличается использование INNER JOIN от OUTER JOIN в SQL при соединении таблиц?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

INNER JOIN соединяет таблицы по условию и оставляет только совпавшие строки.
OUTER JOIN расширяет результат: он может вернуть строки без совпадений, заполняя отсутствующие значения NULL.

Чаще всего под OUTER JOIN имеют в виду LEFT OUTER JOIN, RIGHT OUTER JOIN или FULL OUTER JOIN:

  • LEFT OUTER JOIN — все строки из левой таблицы и совпадения из правой;
  • RIGHT OUTER JOIN — все строки из правой таблицы и совпадения из левой;
  • FULL OUTER JOIN — все строки из обеих таблиц, даже без совпадений.

Пример использования:

Допустим, есть таблицы users и orders. Нужно получить пользователей и их заказы.

-- Только пользователи, у которых есть заказы
SELECT u.id, u.name, o.id AS order_id
FROM users u
INNER JOIN orders o ON o.user_id = u.id;

-- Все пользователи, даже если заказов нет
SELECT u.id, u.name, o.id AS order_id
FROM users u
LEFT OUTER JOIN orders o ON o.user_id = u.id;

Пояснение кода:

В первом запросе INNER JOIN вернёт только тех пользователей, у которых есть хотя бы один заказ. Если пользователь есть в users, но записей в orders для него нет, он не попадёт в результат.

Во втором запросе LEFT OUTER JOIN вернёт всех пользователей из users. Если у пользователя нет заказов, поля из orders будут NULL.

Пример по шагам:

  1. Берутся все строки из users.
  2. Для каждой строки ищется совпадение в orders по o.user_id = u.id.
  3. Если совпадение найдено — данные объединяются.
  4. Если нет совпадения — строка пользователя всё равно остаётся, а поля заказа становятся NULL.

Ключевые моменты:

  • INNER JOIN показывает только пересечение таблиц.
  • OUTER JOIN сохраняет строки без совпадения и подставляет NULL.
  • LEFT JOIN чаще всего используется для поиска “всех из одной таблицы, даже если данных во второй нет”.
  • INNER JOIN обычно даёт меньше строк, чем LEFT/RIGHT/FULL OUTER JOIN.
  • Выбор зависит от бизнес-задачи: нужны только совпадения или важна полнота данных.
  • OUTER JOIN часто используют для поиска отсутствующих связей, например “пользователи без заказов”.