SQL JOIN — оператор языка SQL, который объединяет строки из двух и более таблиц в единую выборку на основе условия соединения ON. Работает в реляционных базах данных — PostgreSQL, MySQL, Oracle — через внешний ключ (Foreign Key). Без JOIN аналитик ограничен одной таблицей и не может восстановить нормализованные данные. Шесть типов JOIN — INNER, LEFT, RIGHT, FULL OUTER, CROSS, SELF — спрашивают на 99% технических собеседований.
JOIN в SQL — оператор языка (не функция и не команда), который строит «мост» между таблицами. Данные в реляционных БД нормализованы: клиенты хранятся в таблице customers, заказы — в orders. По отдельности каждая таблица даёт ограниченный ответ, вместе — полноценную аналитику. Базовый шаблон запроса:
Учитесь бесплатно за счёт государства
Экономия до 100 000 ₽ на любой программе
SELECT колонки
FROM таблица1
JOIN таблица2 ON таблица1.внешний_ключ = таблица2.первичный_ключ;
Нормализация данных устраняет дублирование: название пива «БагБир» записывается один раз, а ссылка на него через идентификатор повторяется в нескольких строках. Это экономит память и ускоряет поиск. «Relate» — «связанный» — именно отсюда происходит слово «реляционная» база данных.
Нормализация требует JOIN для реконструкции полной картины: разбили данные на таблицы ради эффективности — собираем обратно ради анализа. Без него рейтинг покупок не скажет, кто и что купил.
Внешний ключ (Foreign Key) — столбец, который хранит значение первичного ключа (Primary Key) другой таблицы. Типичное именование: beer_id, customer_id, order_id.
Пример: таблица участников содержит столбец beer_id, таблица пива — столбец id. Внешний ключ соединяет их:
ON participants.beer_id = beers.id
Именно внешний ключ — основа JOIN: по нему база данных находит совпадения между строками двух таблиц.
Шесть типов JOIN покрывают все сценарии соединения таблиц:
| Тип JOIN |
Что возвращает |
ON нужен |
Типичный кейс |
|---|---|---|---|
| INNER JOIN | Только совпавшие строки | Да | Заказы с данными клиента |
| LEFT JOIN | Все строки левой таблицы + NULL для несовпавших | Да | Клиенты с заказами и без |
| RIGHT JOIN | Все строки правой таблицы + NULL | Да | Заказы с клиентами и без |
| FULL OUTER JOIN | Все строки обеих таблиц + NULL с обеих сторон | Да | Сверка плана с фактом |
| CROSS JOIN | Все комбинации строк (N × M) | Нет | Матрица цвет × размер |
| SELF JOIN | Строки из одной таблицы в двух ролях | Да | Иерархия сотрудников |
INNER JOIN возвращает строки, для которых найдено совпадение в обеих таблицах. Слово INNER необязательно: JOIN без уточнения — это и есть INNER JOIN. Строки без пары исключаются полностью: участник без указанного пива в результат не попадёт.

База данных берёт строку из первой таблицы, ищет совпадение по условию ON. Нашла — добавляет объединённую строку в результат. Не нашла — строка отбрасывается.
SELECT customers.name, orders.amount
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;
Если в ключевом поле стоит NULL, строка полностью исключается: NULL не равен ни одному значению. Типичная ошибка — забыть ON. Без него SQL построит перекрёстное соединение и вернёт миллионы строк вместо ожидаемого результата.
LEFT JOIN (синоним — LEFT OUTER JOIN, слово OUTER необязательно) возвращает все строки левой таблицы независимо от наличия совпадений в правой. Там, где пары нет, SQL подставляет NULL в колонки правой таблицы. Пример: в результате будут все клиенты — Мария без единого заказа тоже появится, но поле orders.amount у неё будет NULL.
SELECT customers.name, orders.amount
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id;

Паттерн «поиск сирот» — найти всех клиентов без единого заказа:
SELECT customers.name
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
WHERE orders.id IS NULL;
WHERE orders.id IS NULL оставляет только строки, для которых не нашлось пары в правой таблице. NULL — это «данных нет», а не пустая строка и не ноль. Сравнивать можно только через IS NULL или IS NOT NULL, но не через = NULL. LEFT JOIN шире INNER JOIN: возвращает все строки левой таблицы, а не только совпавшие.

RIGHT JOIN симметричен LEFT JOIN: возвращает все строки правой таблицы, заполняя NULL в колонках левой там, где пары нет. На практике RIGHT JOIN часто заменяют LEFT JOIN с переставленными таблицами — результат тот же, а читаемость кода выше.
FULL OUTER JOIN объединяет оба подхода: все строки из обеих таблиц, NULL с обеих сторон там, где совпадений нет. Типичный кейс — сверка плановых кампаний и фактических откликов: нужны все записи, включая непарные.

RIGHT JOIN — все отклики, включая те, что без кампании:
SELECT campaigns.title, responses.id
FROM campaigns
RIGHT JOIN responses ON campaigns.id = responses.campaign_id;
FULL OUTER JOIN — все кампании и все отклики:
SELECT campaigns.title, responses.id
FROM campaigns
FULL OUTER JOIN responses ON campaigns.id = responses.campaign_id;
Оставить только непарные строки с обеих сторон:
WHERE campaigns.id IS NULL OR responses.campaign_id IS NULL
Хотите сменить профессию или повысить квалификацию?
Федеральный проект «Активные меры содействия занятости» даёт возможность пройти обучение бесплатно за счёт государства
CROSS JOIN производит декартово произведение: каждая строка левой таблицы соединяется с каждой строкой правой. Условие ON не требуется. Результат — N × M строк.
SELECT sizes.name, colors.name
FROM sizes
CROSS JOIN colors;
Применение: генерация всех комбинаций характеристик товара — матрица размеров и цветов, расписание временных слотов, тестовые наборы данных.

Три размера × три цвета = 9 комбинаций — управляемо. Но 1 000 строк × 1 000 строк = 1 000 000 строк в результате. CROSS JOIN без осознанной логики создаёт огромную нагрузку на базу данных. Уместен только для генерации всех комбинаций на малых таблицах — при работе с большими объёмами это риск экспоненциального роста данных.
SELF JOIN — соединение таблицы с самой собой. Без псевдонимов (Table Alias) это синтаксически невозможно: SQL должен понимать, в какой роли выступает каждая копия таблицы.
Типичный кейс — таблица сотрудников с полем manager_id, которое ссылается на id другого сотрудника-руководителя из той же таблицы.

SELECT e1.name AS сотрудник, e2.name AS руководитель
FROM employees AS e1
JOIN employees AS e2 ON e1.manager_id = e2.id;
Псевдонимы e1 и e2 делают одну таблицу видимой в двух ролях одновременно. Результат — пары «сотрудник–руководитель». Другие применения: категория–подкатегория, комментарий–ответ на комментарий.

SQL строит JOIN-цепочку слева направо: сначала объединяет первые две таблицы в промежуточный результат, затем присоединяет третью к нему — и так далее. Порядок таблиц влияет на производительность, но не на итоговый результат при корректных условиях ON. При трёх и более таблицах псевдонимы обязательны — без них запрос становится нечитаемым.
Четыре таблицы: клиенты → заказы → позиции заказа → категории:
SELECT c.name, o.id AS order_id, oi.product, cat.name AS category
FROM customers AS c
INNER JOIN orders AS o ON c.id = o.customer_id
INNER JOIN order_items AS oi ON o.id = oi.order_id
LEFT JOIN categories AS cat ON oi.category_id = cat.id;
Последнее соединение — LEFT JOIN, потому что у некоторых позиций категория может отсутствовать. Псевдонимы c, o, oi, cat сокращают код и выделяют роль каждой таблицы. Порядок JOIN не влияет на результат, но может влиять на скорость выполнения запроса.

SQL Server Management Studio (SSMS) — графическая среда Microsoft SQL Server. Синтаксис JOIN в SQL идентичен стандарту ISO/IEC SQL, поэтому запросы работают без изменений.
Пошагово:
Тот же принцип работает в pgAdmin (для PostgreSQL) и MySQL Workbench — инструменты разные, синтаксис JOIN одинаковый.
| Ситуация |
Тип JOIN |
|---|---|
| Нужны только совпадающие записи | INNER JOIN |
| Все записи из левой таблицы + данные из правой | LEFT JOIN |
| Все записи из обеих таблиц | FULL OUTER JOIN |
| Найти записи без пары | LEFT JOIN + WHERE IS NULL |
| Все комбинации строк двух таблиц | CROSS JOIN |
| Иерархия внутри одной таблицы | SELF JOIN |
Хотите освоить SQL и анализ данных с нуля? В рамках федерального проекта «Активные меры содействия занятости» можно пройти обучение по аналитике данных без отрыва от работы и без вложений. Смотрите каталог доступных программ.
INNER JOIN возвращает только строки, для которых найдено совпадение в обеих таблицах. LEFT JOIN возвращает все строки левой таблицы — при отсутствии совпадения справа ставит NULL. Клиент без заказов: INNER JOIN его исключит, LEFT JOIN сохранит с NULL в полях заказа.
JOIN без дополнительного слова — сокращённая запись INNER JOIN. Слово INNER необязательно: FROM t1 JOIN t2 ON … и FROM t1 INNER JOIN t2 ON … дают одинаковый результат.
Шаблон: SELECT колонки FROM таблица1 ТИП_JOIN таблица2 ON таблица1.внешний_ключ = таблица2.первичный_ключ. Условие ON обязательно для всех типов, кроме CROSS JOIN.
NULL — специальное значение SQL, означающее «данных нет». В OUTER JOIN появляется там, где не нашлось совпадения. NULL — не пустая строка и не ноль. Фильтровать строки без пары: WHERE col IS NULL.
FULL OUTER JOIN нужен при полном двустороннем анализе: все строки из обеих таблиц, включая строки без пары. Типичный кейс — сверка плана с фактом: все кампании и все отклики, в том числе непарные.
Да. Цепочка: FROM t1 JOIN t2 ON … JOIN t3 ON … JOIN t4 ON …. SQL выполняет слева направо, каждый JOIN применяется к результату предыдущего. Псевдонимы (AS) обязательны для читаемости при трёх и более таблицах.
Начните с реляционной модели: данные разбиты по таблицам, связанным через внешний ключ. Освойте INNER JOIN и LEFT JOIN — они покрывают 90% задач. Затем — RIGHT, FULL, CROSS, SELF JOIN. Практикуйтесь в PostgreSQL или MySQL.
Псевдонимы сокращают код и обязательны для SELF JOIN — когда таблица соединяется сама с собой в двух ролях: FROM employees AS e1 JOIN employees AS e2 ON e1.manager_id = e2.id. Без AS синтаксис не сработает.
Подайте заявку —
забронируйте место в группе
45 000 мест на 2026 год. Бесплатное обучение по федеральному проекту «Активные меры содействия занятости»