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

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

1.2 Junior🔥 251 комментариев
#SQL и базы данных

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

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

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

Ответ: В чём разница между INNER JOIN и LEFT/RIGHT JOIN?

Основное различие

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

INNER JOIN

INNER JOIN возвращает только строки, у которых есть совпадение в обеих таблицах.

SELECT 
    customers.customer_id,
    customers.name,
    orders.order_id,
    orders.amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

Результат:

customer_id | name    | order_id | amount
1           | Alice   | 101      | 500
1           | Alice   | 102      | 750
3           | Charlie | 103      | 200

Если у клиента нет заказов или есть заказ без клиента — такие строки не попадут в результат.

LEFT JOIN (LEFT OUTER JOIN)

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

SELECT 
    customers.customer_id,
    customers.name,
    orders.order_id,
    orders.amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

Результат:

customer_id | name    | order_id | amount
1           | Alice   | 101      | 500
1           | Alice   | 102      | 750
2           | Bob     | NULL     | NULL      -- Bob нет заказов, но он включен
3           | Charlie | 103      | 200

RIGHT JOIN (RIGHT OUTER JOIN)

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

SELECT 
    customers.customer_id,
    customers.name,
    orders.order_id,
    orders.amount
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

Результат:

customer_id | name    | order_id | amount
1           | Alice   | 101      | 500
1           | Alice   | 102      | 750
3           | Charlie | 103      | 200
NULL        | NULL    | 104      | 100     -- Заказ без клиента

FULL OUTER JOIN

FULL OUTER JOIN возвращает все строки из обеих таблиц, с NULL для несовпадающих.

SELECT 
    customers.customer_id,
    customers.name,
    orders.order_id,
    orders.amount
FROM customers
FULL OUTER JOIN orders ON customers.customer_id = orders.customer_id;

Результат:

customer_id | name    | order_id | amount
1           | Alice   | 101      | 500
1           | Alice   | 102      | 750
2           | Bob     | NULL     | NULL
3           | Charlie | 103      | 200
NULL        | NULL    | 104      | 100

Сравнение типов JOIN (визуально)

Тип JOINВключает строкиВизуализация
INNER JOINТолько совпадающие из обеих таблицПересечение двух кругов
LEFT JOINВсе из левой + совпадающие из правойЛевый круг полностью
RIGHT JOINВсе из правой + совпадающие из левойПравый круг полностью
FULL OUTER JOINВсе из обеих таблицОба круга полностью

Практические примеры

Пример 1: Найти всех клиентов и их заказы (с учетом тех, у кого нет заказов)

SELECT 
    c.customer_id,
    c.name,
    COUNT(o.order_id) as total_orders,
    COALESCE(SUM(o.amount), 0) as total_spent
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name
ORDER BY total_spent DESC;

Результат будет включать Bob, даже если у него нет заказов (total_orders = 0).

Пример 2: Найти только клиентов с заказами

SELECT 
    c.customer_id,
    c.name,
    COUNT(o.order_id) as total_orders
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name;

Bob будет исключен из результата.

Пример 3: Найти клиентов И заказы без клиента (проверка целостности данных)

SELECT 
    COALESCE(c.customer_id, o.customer_id) as customer_id,
    c.name,
    o.order_id,
    o.amount
FROM customers c
FULL OUTER JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL OR o.customer_id IS NULL;

Это помогает найти проблемы в данных.

Ключевые различия

КритерийINNER JOINLEFT JOINRIGHT JOIN
Обе таблицы совпадают✓ Включает✓ Включает✓ Включает
Только в левой таблице✗ Исключает✓ Включает✗ Исключает
Только в правой таблице✗ Исключает✗ Исключает✓ Включает
NULL значения в результатеНетДа (для правой)Да (для левой)

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

  • INNER JOIN обычно быстрее, т.к. меньше строк в результате
  • LEFT/RIGHT/FULL JOIN — потенциально медленнее, но необходимы для полноты данных

Когда использовать

  1. INNER JOIN — когда нужны только совпадающие записи (например, только заказы с подтвержденными клиентами)
  2. LEFT JOIN — когда нужны все записи из левой таблицы (например, все клиенты независимо от заказов)
  3. RIGHT JOIN — реже (обычно переписывают как LEFT JOIN, переставив таблицы)
  4. FULL OUTER JOIN — для анализа целостности данных или синхронизации

Заключение: Выбор типа JOIN критически важен для правильного получения данных. INNER JOIN фильтрует, LEFT JOIN сохраняет левую таблицу полностью. Понимание этого различия — базовый навык Data Scientist при работе с SQL.