Какие типы JOIN вы знаете и в чём между ними разница?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие типы 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:
-
Всегда указывай условие соединения — используй ON, не WHERE для связи таблиц.
-
Проверяй количество строк — особенно при LEFT/RIGHT JOIN, может быть дублирование, если ключ не уникален.
-
Используй алиасы — упрощает чтение и предотвращает ошибки.
-
Порядок условий важен — 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 критичен для получения корректных результатов аналитики.