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

Какие знаешь виды JOIN-запросов?

1.0 Junior🔥 231 комментариев
#Архитектура систем#Базы данных и SQL

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

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

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

Виды JOIN-запросов в SQL

JOIN — это операция, которая объединяет данные из двух или более таблиц в одном результирующем наборе. Существует несколько основных видов JOIN, которые отличаются способом объединения и включением строк.

1. INNER JOIN

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

SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.dept_id = departments.id;

Особенности:

  • Самый частый тип JOIN
  • Строки без пары не включаются
  • Эквивалент просто "JOIN" (INNER подразумевается по умолчанию)
  • Быстро работает при правильных индексах

Пример:

Таблица employees: (1, Alice, dept:10), (2, Bob, dept:20)
Таблица departments: (10, Sales), (20, IT), (30, HR)

Результат INNER JOIN:
- Alice, Sales
- Bob, IT
(строка с dept:30 не будет, т.к. нет сотрудников в HR)

2. LEFT JOIN (LEFT OUTER JOIN)

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

SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.id;

Особенности:

  • Все сотрудники будут в результате, даже без отдела
  • Правая таблица может иметь NULL значения
  • Левая таблица — доминирующая

Пример:

Таблица employees: (1, Alice, dept:10), (2, Bob, dept:20), (3, Charlie, dept:NULL)
Таблица departments: (10, Sales), (20, IT)

Результат LEFT JOIN:
- Alice, Sales
- Bob, IT
- Charlie, NULL

3. RIGHT JOIN (RIGHT OUTER JOIN)

Возвращает все строки из правой таблицы, и совпадающие строки из левой таблицы. Противоположность LEFT JOIN.

SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.id;

Особенности:

  • Все отделы будут в результате, даже без сотрудников
  • Левая таблица может иметь NULL значения
  • Правая таблица — доминирующая

Пример:

Таблица employees: (1, Alice, dept:10), (2, Bob, dept:20)
Таблица departments: (10, Sales), (20, IT), (30, HR)

Результат RIGHT JOIN:
- Alice, Sales
- Bob, IT
- NULL, HR

4. FULL OUTER JOIN (FULL JOIN)

Возвращает все строки из обеих таблиц. Если совпадения нет, используются NULL с обеих сторон.

SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments ON employees.dept_id = departments.id;

Особенности:

  • Включает все записи из обеих таблиц
  • Может быть много NULL значений
  • Не поддерживается в MySQL (нужно эмулировать через UNION)

Пример:

Таблица employees: (1, Alice, dept:10), (2, Bob, dept:20), (3, Charlie, dept:NULL)
Таблица departments: (10, Sales), (20, IT), (30, HR)

Результат FULL OUTER JOIN:
- Alice, Sales
- Bob, IT
- Charlie, NULL
- NULL, HR

5. CROSS JOIN

Возвращает декартово произведение двух таблиц (все возможные комбинации).

SELECT employees.name, departments.name
FROM employees
CROSS JOIN departments;

Особенности:

  • Не требует условия ON
  • Результат: n × m строк (если n строк в 1-й, m во 2-й)
  • Может вернуть огромное количество данных
  • Медленно на больших таблицах

Пример:

Таблица employees: (Alice), (Bob)
Таблица departments: (Sales), (IT), (HR)

Результат CROSS JOIN (2 × 3 = 6 строк):
- Alice, Sales
- Alice, IT
- Alice, HR
- Bob, Sales
- Bob, IT
- Bob, HR

6. SELF JOIN

Объединение таблицы с самой собой. Используется когда связь есть внутри одной таблицы.

SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
INNER JOIN employees e2 ON e1.manager_id = e2.id;

Применение:

  • Иерархия сотрудников (сотрудник — менеджер)
  • Дерево категорий
  • Граф связей

Пример:

Таблица employees: 
(1, Alice, manager_id:3)
(2, Bob, manager_id:3)
(3, Charlie, manager_id:NULL)

Результат SELF JOIN:
- Alice, Charlie
- Bob, Charlie

Сравнение видов JOIN

ТипЛеваяПраваяNULLПрименение
INNERТолько совпаденияТолько совпаденияНетНужны связанные записи
LEFTВсеТолько совпаденияДа (справа)Все записи слева + связанные
RIGHTТолько совпаденияВсеДа (слева)Все записи справа + связанные
FULLВсеВсеДа (обе)Все записи из обеих
CROSSВсеВсеНетДекартово произведение

Условия JOIN

Задаются в условии ON:

-- Простое условие
INNER JOIN departments ON employees.dept_id = departments.id

-- Множественные условия
INNER JOIN departments ON employees.dept_id = departments.id 
                      AND employees.company_id = departments.company_id

-- Сложные условия
LEFT JOIN orders ON customers.id = orders.customer_id 
                AND orders.status = 'active'
                AND orders.created_date > '2025-01-01'

Производительность JOIN

Best practices:

  • Индексируй столбцы в условиях JOIN
  • Фильтруй данные WHERE перед JOIN если возможно
  • Избегай JOIN слишком больших таблиц
  • Пользуйся EXPLAIN для анализа плана выполнения

Порядок выполнения JOIN:

  1. Выполняется первый JOIN
  2. К результату применяется второй JOIN
  3. К результату применяется третий JOIN и т.д.
  4. Применяются условия WHERE
  5. GROUP BY, HAVING
  6. ORDER BY

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

INNER JOIN — получить список сотрудников с отделами:

SELECT e.name, d.name, e.salary
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id
ORDER BY e.name;

LEFT JOIN — сотрудники и их заказы (даже без заказов):

SELECT c.name, COUNT(o.id) as order_count
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id;

FULL OUTER JOIN — найти несоответствия между таблицами:

SELECT e.name, d.name
FROM employees e
FULL OUTER JOIN departments d ON e.dept_id = d.id
WHERE e.id IS NULL OR d.id IS NULL;

Эмуляция FULL OUTER JOIN в MySQL

SELECT e.name, d.name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id
UNION
SELECT e.name, d.name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.id;

Заключение

Выбор типа JOIN критичен для корректности результата:

  • INNER JOIN — только связанные записи
  • LEFT/RIGHT JOIN — все записи с одной стороны + совпадения
  • FULL OUTER JOIN — все записи из обеих таблиц
  • CROSS JOIN — все комбинации
  • SELF JOIN — связи внутри таблицы

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