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

Какие типы JOIN вы знаете и в чём между ними разница?

2.0 Middle🔥 211 комментариев
#SQL и базы данных

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

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

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

Какие типы JOIN вы знаете и в чём между ними разница?

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

Основные типы JOIN:

1. INNER JOIN — внутреннее соединение

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

SELECT 
    o.order_id,
    o.customer_id,
    c.customer_name,
    o.amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id;

Результат: только заказы, у которых есть соответствующий покупатель в таблице customers.

2. LEFT JOIN (LEFT OUTER JOIN) — левое внешнее соединение

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

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

Результат: все покупатели, даже те, у которых нет заказов (для них order_count = 0 или NULL).

3. RIGHT JOIN (RIGHT OUTER JOIN) — правое внешнее соединение

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

SELECT 
    o.order_id,
    o.customer_id,
    c.customer_name
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id;

Результат: все заказы, даже если покупатель не найден в таблице customers.

4. FULL OUTER JOIN — полное внешнее соединение

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

SELECT 
    c.customer_id,
    c.customer_name,
    o.order_id,
    o.amount
FROM customers c
FULL OUTER JOIN orders o ON c.customer_id = o.customer_id;

Результат: все покупатели и все заказы, включая те, которые не имеют соответствия в другой таблице.

5. CROSS JOIN — перекрёстное соединение

Возвращает декартово произведение двух таблиц — каждая строка из первой таблицы соединяется с каждой строкой из второй.

SELECT 
    c.customer_id,
    p.product_id
FROM customers c
CROSS JOIN products p;

Результат: все возможные комбинации покупателей и товаров.

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

Таблица A: {1, 2, 3} Таблица B: {2, 3, 4}

INNER JOIN: {2, 3} LEFT JOIN: {1, 2, 3} + NULL для отсутствия RIGHT JOIN: {2, 3, 4} + NULL для отсутствия FULL OUTER JOIN: {1, 2, 3, 4} + NULL где нужно CROSS JOIN: все комбинации

Практический пример с несколькими JOIN:

SELECT 
    o.order_id,
    c.customer_name,
    p.product_name,
    o.quantity,
    o.amount,
    o.order_date
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN products p ON o.product_id = p.product_id
WHERE o.order_date >= '2024-01-01'
ORDER BY o.order_date DESC;

Важные правила при использовании JOIN:

  1. Всегда указывай условие соединения — используй ON, не WHERE для связи таблиц.

  2. Проверяй количество строк — особенно при LEFT/RIGHT JOIN, может быть дублирование, если ключ не уникален.

  3. Используй алиасы — упрощает чтение и предотвращает ошибки.

  4. Порядок условий важен — WHERE применяется после JOIN, поэтому при LEFT JOIN не пиши условие по правой таблице в WHERE (перенеси в ON).

Типичная ошибка:

SELECT *
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_id IS NOT NULL;

Это условие в WHERE превратит LEFT JOIN в INNER JOIN! Правильно: перенеси условие в ON.

Выбор правильного типа JOIN критичен для получения корректных результатов аналитики.

Какие типы JOIN вы знаете и в чём между ними разница? | PrepBro