В чём разница между INNER JOIN и LEFT/RIGHT JOIN?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ: В чём разница между 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 JOIN | LEFT JOIN | RIGHT JOIN |
|---|---|---|---|
| Обе таблицы совпадают | ✓ Включает | ✓ Включает | ✓ Включает |
| Только в левой таблице | ✗ Исключает | ✓ Включает | ✗ Исключает |
| Только в правой таблице | ✗ Исключает | ✗ Исключает | ✓ Включает |
| NULL значения в результате | Нет | Да (для правой) | Да (для левой) |
Производительность
- INNER JOIN обычно быстрее, т.к. меньше строк в результате
- LEFT/RIGHT/FULL JOIN — потенциально медленнее, но необходимы для полноты данных
Когда использовать
- INNER JOIN — когда нужны только совпадающие записи (например, только заказы с подтвержденными клиентами)
- LEFT JOIN — когда нужны все записи из левой таблицы (например, все клиенты независимо от заказов)
- RIGHT JOIN — реже (обычно переписывают как LEFT JOIN, переставив таблицы)
- FULL OUTER JOIN — для анализа целостности данных или синхронизации
Заключение: Выбор типа JOIN критически важен для правильного получения данных. INNER JOIN фильтрует, LEFT JOIN сохраняет левую таблицу полностью. Понимание этого различия — базовый навык Data Scientist при работе с SQL.