← Назад к вопросам

В чем разница между outer join и inner join?

2.0 Middle🔥 171 комментариев
#Инструменты тестирования#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между INNER JOIN и OUTER JOIN

Основное различие между INNER JOIN и OUTER JOIN заключается в логике объединения данных из двух таблиц. Эта разница фундаментальна для понимания работы SQL и построения корректных запросов.

Логика работы INNER JOIN

INNER JOIN (или просто JOIN) возвращает только те строки, для которых условие соединения (ON или USING) выполняется в обеих таблицах. Это пересечение множеств. Если для строки из левой таблицы нет соответствующей (совпадающей по условию) строки в правой, или наоборот, такие строки в результирующий набор не попадут.

Простая аналогия: Два списка: "Сотрудники" и "Проекты". INNER JOIN по "ID менеджера" покажет только тех сотрудников, которые назначены на существующие проекты, и только те проекты, на которые назначены реальные сотрудники. Сотрудники без проектов и проекты без менеджеров будут проигнорированы.

Пример кода:

-- INNER JOIN: Найдем всех пользователей и их заказы, но только если заказ действительно существует.
SELECT users.name, orders.order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Этот запрос не вернет пользователей, у которых нет ни одного заказа (строки из users без совпадений в orders).

Логика работы OUTER JOIN

OUTER JOIN, в отличие от внутреннего, возвращает все строки из одной или обеих таблиц, даже если для них нет совпадений в другой таблице. В таких случаях отсутствующие значения заполняются NULL. Существует три типа OUTER JOIN:

  • LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы (первой в запросе) и соответствующие строки из правой. Если соответствия нет, поля из правой таблицы будут NULL.
  • RIGHT (OUTER) JOIN: Возвращает все строки из правой таблицы и соответствующие строки из левой. Если соответствия нет, поля из левой таблицы будут NULL.
  • FULL (OUTER) JOIN: Возвращает все строки из обеих таблиц. Если для строки из одной таблицы нет совпадения в другой, соответствующие поля заполняются NULL. (Не поддерживается во всех СУБД, например, в MySQL отсутствует, но может быть эмулирован).

Простая аналогия: Используя те же списки, LEFT JOIN (где users — левая таблица) покажет всех сотрудников, а для тех, у кого нет проекта, в графах проекта будет NULL.

Пример кода:

-- LEFT OUTER JOIN: Найдем ВСЕХ пользователей и их заказы (если они есть).
SELECT users.name, orders.order_id, orders.amount
FROM users
LEFT OUTER JOIN orders ON users.id = orders.user_id;

-- Пользователи без заказов будут в результате с order_id = NULL и amount = NULL.

Сравнительная таблица

КритерийINNER JOINLEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN
Основной принципПересечение (только совпадения)Все из левой + совпадения справаВсе из правой + совпадения слеваОбъединение (все строки)
Результат при отсутствии совпаденияСтрока исключается из выдачиСтрока из левой таблицы выводится, поля справа — NULLСтрока из правой таблицы выводится, поля слева — NULLВыводятся строки из обеих таблиц, недостающие поля — NULL
Использование в аналитикеДля анализа связанных событий/сущностейДля анализа "охвата" (напр., все пользователи vs совершившие действие)Аналогично LEFT, но с приоритетом правой таблицыДля полного сравнения двух наборов данных, поиска разрывов

Практическое значение для QA Engineer

Понимание этой разницы критически важно для тестирования:

  1. Валидация отчетов и дашбордов: Если бизнес-требование гласит "отобразить всех клиентов", а разработчик по ошибке использовал INNER JOIN с таблицей покупок, в отчете будут только совершавшие покупки. Тестировщик должен проверить граничные случаи с NULL-значениями.
  2. Понимание данных: При составлении собственных запросов для проверки данных или создании тестовых сценариев выбор неправильного типа JOIN приведет к неполным или избыточным данным.
  3. Анализ дефектов: Частой причиной дефекта "пропали данные" является ошибочная замена LEFT JOIN на INNER JOIN.

Итог: INNER JOIN сужает выборку, оставляя только связанные данные. OUTER JOIN расширяет выборку, сохраняя все данные основной таблицы (или таблиц) и "добивая" их связанной информацией, если она есть. Выбор типа соединения всегда определяется бизнес-логикой запроса.

В чем разница между outer join и inner join? | PrepBro