INNER JOIN, LEFT JOIN и RIGHT JOIN – чем отличаются SQL-соединения на примерах

JOIN в SQL нужен для того, чтобы объединять данные из нескольких таблиц. Для системного аналитика это один из ключевых навыков: без понимания соединений сложно проверять данные, читать структуру базы, формулировать требования к отчетам и обсуждать логику с разработчиками.

На практике аналитик редко работает с одной таблицей. Например, пользователи могут храниться в одной таблице, заказы – во второй, платежи – в третьей, статусы доставки – в четвертой. Чтобы получить осмысленную картину, нужно связать эти данные между собой. Именно для этого используются INNER JOIN, LEFT JOIN и RIGHT JOIN.
Зачем системному аналитику понимать JOIN
Системный аналитик не обязан быть разработчиком баз данных, но он должен понимать, как данные связаны между собой и что произойдет при неправильном соединении таблиц. Ошибка в JOIN может привести к неверному отчету, потере части строк или, наоборот, появлению лишних данных.

Например, бизнес просит отчет по клиентам и их заказам. Если аналитик не понимает разницу между INNER JOIN и LEFT JOIN, он может случайно исключить клиентов без заказов. Для отчета по активным покупателям это нормально, а для анализа всей клиентской базы – уже ошибка.

Понимание JOIN помогает:

  • Правильно читать SQL-запросы;
  • Проверять логику выгрузок и отчетов;
  • Понимать, почему в выборке пропали строки;
  • Формулировать требования к данным без двусмысленности;
  • Общаться с разработчиками, BI-специалистами и администраторами баз данных.

Если вы только начинаете разбираться в SQL, лучше идти от простых запросов к соединениям таблиц. Для этого хорошо подходит курс «Основы баз данных и SQL», где можно последовательно разобрать SELECT, фильтрацию, группировку и разные виды JOIN.
Что такое JOIN простыми словами
JOIN – это способ соединить строки из двух таблиц по общему признаку. Чаще всего таким признаком является идентификатор.

Представим две таблицы:

Таблица clients хранит клиентов:

  • id;
  • name.
Таблица orders хранит заказы:

  • id;
  • client_id;
  • amount.

Поле clients.id показывает уникальный номер клиента. Поле orders.client_id показывает, какому клиенту принадлежит заказ. Чтобы получить список клиентов вместе с их заказами, нужно соединить эти таблицы.

Пример базовой структуры запроса:

SELECT clients.name, orders.amount
FROM clients
JOIN orders ON clients.id = orders.client_id;

В этом примере SQL сопоставляет строки из двух таблиц: берет клиента и ищет заказы, где orders.client_id совпадает с clients.id.

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

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

Пример:

SELECT clients.name, orders.amount
FROM clients
INNER JOIN orders ON clients.id = orders.client_id;

Такой запрос покажет только клиентов, у которых есть заказы.
INNER JOIN удобно использовать, когда нужны только связанные данные. Например, список заказов с именами клиентов, список платежей с номерами договоров, список сотрудников с закрепленными подразделениями.

INNER JOIN подходит, когда важно получить только полные пары данных:

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

Главный риск INNER JOIN – он может скрыть отсутствие связи. Если аналитик хочет найти клиентов без заказов, такой тип соединения не подойдет, потому что он просто уберет их из результата.
LEFT JOIN – все строки из левой таблицы
LEFT JOIN возвращает все строки из левой таблицы и добавляет данные из правой таблицы, если совпадение найдено. Если совпадения нет, поля правой таблицы будут заполнены значением NULL.
Левая таблица – это та, которая указана после FROM.

Пример:

SELECT clients.name, orders.amount
FROM clients
LEFT JOIN orders ON clients.id = orders.client_id;

Такой запрос покажет всех клиентов. Если у клиента есть заказ, рядом будет сумма заказа. Если заказов нет, в поле orders.amount будет NULL.

LEFT JOIN особенно полезен для аналитических задач. С его помощью можно не только получить связанные данные, но и увидеть, где связи отсутствуют.

Например, нужно найти клиентов, которые еще ничего не покупали:

SELECT clients.name
FROM clients
LEFT JOIN orders ON clients.id = orders.client_id
WHERE orders.id IS NULL;

Здесь логика такая: сначала SQL берет всех клиентов, затем пытается найти их заказы, а после этого оставляет только тех, у кого заказ не найден.

LEFT JOIN часто используется, когда важно сохранить основную сущность:

  • Все клиенты и их заказы, если они есть;
  • Все товары и остатки на складе, если они заведены;
  • Все заявки и комментарии менеджеров, если комментарии уже оставлены;
  • Все пользователи и последние авторизации, если они были;
  • Все договоры и платежи, если оплаты поступали.

Для системного аналитика LEFT JOIN важен еще и потому, что он помогает находить «дыры» в данных: незаполненные связи, ошибки интеграции, незавершенные процессы, отсутствие обязательных записей.
RIGHT JOIN – все строки из правой таблицы
RIGHT JOIN работает зеркально по отношению к LEFT JOIN. Он возвращает все строки из правой таблицы и добавляет данные из левой, если совпадение найдено. Если совпадения нет, поля левой таблицы будут заполнены NULL.

Пример:

SELECT clients.name, orders.amount
FROM clients
RIGHT JOIN orders ON clients.id = orders.client_id;

Такой запрос покажет все заказы. Если для заказа найден клиент, будет выведено его имя. Если клиент не найден, имя будет NULL.

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

SELECT clients.name, orders.amount
FROM orders
LEFT JOIN clients ON clients.id = orders.client_id;

Результат будет похожим: мы сохраняем все строки из таблицы заказов и подтягиваем клиентов, если они есть.

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

INNER JOIN оставляет только совпадения. Если связи нет, строка не попадет в результат.
LEFT JOIN сохраняет все строки из левой таблицы. Если связи справа нет, в связанных полях будет NULL.
RIGHT JOIN сохраняет все строки из правой таблицы. Если связи слева нет, в связанных полях будет NULL.

Проще запомнить так: INNER JOIN отвечает на вопрос «где есть связь?», LEFT JOIN – «что есть в основной таблице и что к этому привязано?», RIGHT JOIN – «что есть в правой таблице и что к этому привязано слева?».

Для аналитика чаще всего наиболее важны INNER JOIN и LEFT JOIN. Первый помогает получать связанные данные, второй – проверять полноту связей и находить отсутствующие записи.
Пример из реальной аналитической задачи
Представим, что есть CRM-система. В ней есть таблица клиентов и таблица заявок. Бизнес хочет понять, сколько клиентов оставили заявки, а сколько еще не проявили активность.

Если использовать INNER JOIN:

SELECT clients.name, requests.id
FROM clients
INNER JOIN requests ON clients.id = requests.client_id;

В результат попадут только клиенты, у которых есть заявки. Это подходит для анализа активности, но не подходит для оценки всей клиентской базы.

Если использовать LEFT JOIN:

SELECT clients.name, requests.id
FROM clients
LEFT JOIN requests ON clients.id = requests.client_id;

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

А если нужно найти именно клиентов без заявок:

SELECT clients.name
FROM clients
LEFT JOIN requests ON clients.id = requests.client_id
WHERE requests.id IS NULL;

Такой подход часто используется в аналитике: не просто получить данные, а найти исключения. Например, пользователей без профиля, заказы без оплаты, договоры без актов, товары без категории.
Типичные ошибки при работе с JOIN
Одна из частых ошибок – использовать INNER JOIN там, где нужен LEFT JOIN. В результате часть данных пропадает, а отчет выглядит корректным только на первый взгляд.

Еще одна ошибка – соединять таблицы не по тому полю. Например, связывать заказ не с клиентом, а с менеджером, потому что оба поля называются похоже. В больших системах это приводит к серьезным искажениям данных.

Также важно понимать, что JOIN может размножать строки. Если у одного клиента несколько заказов, то после соединения клиент появится в результате несколько раз – по одному разу на каждый заказ. Это нормальное поведение SQL, но его нужно учитывать при подсчете количества клиентов, заказов или сумм.

Перед использованием JOIN полезно проверить:

  • Какая таблица является основной для задачи;
  • По какому полю таблицы должны соединяться;
  • Нужно ли сохранять строки без совпадений;
  • Возможна ли ситуация «один ко многим»;
  • Не повлияет ли соединение на итоговые суммы и количество строк.

На курсе «Базы данных. Hard» такие темы обычно становятся особенно важными: там уже недостаточно просто написать запрос, нужно понимать структуру данных, связи, ограничения, индексы и влияние запроса на результат.
Как JOIN связан с работой системного аналитика
SQL-соединения нужны системному аналитику не только для самостоятельных запросов. Они помогают лучше проектировать требования к системе.

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

JOIN также полезен при разборе API. Даже если данные приходят через REST API в формате JSON, внутри системы они часто хранятся в связанных таблицах. Понимание SQL помогает аналитику лучше видеть, откуда берутся поля в ответе, почему одни данные обязательны, а другие могут быть null, и как связаны сущности на уровне базы.

Поэтому тема JOIN хорошо дополняет не только курс «Основы баз данных и SQL», но и обучение по проектированию интеграций. А если аналитик работает с REST API, знание связей в базе помогает точнее описывать модели данных, контракты и проверки.
Как выбрать нужный JOIN
Выбор типа соединения зависит не от привычки, а от бизнес-вопроса.
Если нужно показать только связанные записи, подойдет INNER JOIN. Например, только заказы, у которых есть клиент, или только платежи, привязанные к счетам.

Если нужно сохранить все записи из основной таблицы, лучше использовать LEFT JOIN. Например, всех клиентов, все товары, все заявки или все договоры, даже если связанные данные еще не появились.

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

Хороший аналитик сначала формулирует вопрос на языке бизнеса, а уже потом выбирает SQL-конструкцию. Не «какой JOIN применить?», а «какие строки должны остаться в результате, даже если связи нет?».
Вывод
INNER JOIN, LEFT JOIN и RIGHT JOIN отличаются тем, какие строки они сохраняют при соединении таблиц. INNER JOIN показывает только совпадения, LEFT JOIN сохраняет все строки из левой таблицы, RIGHT JOIN – все строки из правой.

Для системного аналитика понимание этих различий важно не только при написании SQL-запросов. JOIN помогает видеть структуру данных, находить ошибки в связях, проверять отчеты, описывать требования и увереннее общаться с разработчиками.

Если вы только начинаете изучать SQL, стоит сначала разобраться с базовыми SELECT-запросами, фильтрацией и группировкой, а затем переходить к JOIN. Для этого подойдет курс «Основы баз данных и SQL». Если база уже есть и хочется глубже понимать связи, ограничения и сложные запросы, логичным следующим шагом станет курс «Базы данных. Hard».

Систем Аналист: Учись и практикуй

Начать учиться