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

В чём разница между INNER JOIN, LEFT JOIN и RIGHT JOIN?

1.7 Middle🔥 162 комментариев
#Базы данных и SQL

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

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

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

Разница между INNER JOIN, LEFT JOIN и RIGHT JOIN в SQL

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

INNER JOIN (Внутреннее соединение)

INNER JOIN возвращает только те строки, где есть совпадение в ОБЕИХ таблицах согласно условию соединения. Это наиболее часто используемый тип соединения.

Принцип работы:

  • Из левой таблицы выбираются строки
  • Для каждой строки ищется соответствие в правой таблице по условию ON
  • В результат попадают только пары строк, где найдено соответствие
  • Строки без соответствия в любой из таблиц исключаются из результата
-- Пример: Получить заказы только тех клиентов, которые существуют в таблице clients
SELECT o.order_id, c.client_name, o.order_date
FROM orders o
INNER JOIN clients c ON o.client_id = c.client_id;

LEFT JOIN (Левое внешнее соединение)

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

Принцип работы:

  • Берутся все строки из левой таблицы
  • Для каждой строки ищется соответствие в правой таблице
  • Если соответствие найдено - строки объединяются
  • Если соответствие не найдено - все столбцы правой таблицы заполняются NULL
  • Результат всегда содержит все строки левой таблицы
-- Пример: Получить всех клиентов и их заказы (если есть)
SELECT c.client_name, o.order_id, o.order_date
FROM clients c
LEFT JOIN orders o ON c.client_id = o.client_id;
-- Клиенты без заказов будут в результате с NULL в столбцах заказов

RIGHT JOIN (Правое внешнее соединение)

RIGHT JOIN является зеркальным отражением LEFT JOIN - возвращает ВСЕ строки из правой таблицы и соответствующие строки из левой таблицы. Если соответствие не найдено, для столбцов левой таблицы будут значения NULL.

Принцип работы:

  • Берутся все строки из правой таблицы
  • Для каждой строки ищется соответствие в левой таблице
  • Результат всегда содержит все строки правой таблицы
-- Пример: Получить все заказы и информацию о клиентах (если клиент существует)
SELECT o.order_id, c.client_name, o.order_date
FROM orders o
RIGHT JOIN clients c ON o.client_id = c.client_id;
-- Все клиенты будут в результате, даже если у них нет заказов

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

КритерийINNER JOINLEFT JOINRIGHT JOIN
Основной источникОбе таблицыЛевая таблицаПравая таблица
Строки без совпаденийИсключаютсяСохраняются из левой таблицыСохраняются из правой таблицы
NULL значенияНе появляютсяВ столбцах правой таблицыВ столбцах левой таблицы
Эквивалентность-RIGHT JOIN с поменянными таблицамиLEFT JOIN с поменянными таблицами

Практические рекомендации

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

  2. Производительность: В большинстве СУБД нет существенной разницы в производительности между разными типами JOIN при правильных индексах, но INNER JOIN обычно быстрее, так как обрабатывает меньше данных.

  3. Использование WHERE с JOIN:

    -- INNER JOIN с фильтрацией
    SELECT * FROM table1 t1
    INNER JOIN table2 t2 ON t1.id = t2.table1_id
    WHERE t2.status = 'active';
    
    -- LEFT JOIN с фильтрацией по правой таблице превращается в INNER JOIN
    SELECT * FROM table1 t1
    LEFT JOIN table2 t2 ON t1.id = t2.table1_id
    WHERE t2.status = 'active'; -- Это эквивалентно INNER JOIN!
    
    -- Правильный способ фильтрации для LEFT JOIN
    SELECT * FROM table1 t1
    LEFT JOIN table2 t2 ON t1.id = t2.table1_id AND t2.status = 'active';
    
  4. Проверка отсутствия записей: LEFT JOIN часто используется для поиска записей, которым нет соответствия:

    -- Найти клиентов без заказов
    SELECT c.* 
    FROM clients c
    LEFT JOIN orders o ON c.client_id = o.client_id
    WHERE o.order_id IS NULL;
    

Понимание различий между типами JOIN критически важно для написания корректных SQL-запросов и эффективной работы с реляционными базами данных.