Полное внешнее соединение: FULL JOIN — объединение всех строк

Что такое FULL JOIN и зачем он нужен? 🤔

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


Как работает FULL JOIN? ⚙️

Принцип прост:

  1. Берутся все строки из левой таблицы (как в LEFT JOIN)
  2. Добавляются все строки из правой таблицы (как в RIGHT JOIN)
  3. Если есть совпадения по условию соединения — строки объединяются
  4. Если нет совпадений — недостающие значения заполняются NULL
SELECT *
FROM таблица1
FULL JOIN таблица2 ON таблица1.ключ = таблица2.ключ

Реальный пример: Анализ продаж и возвратов 🛒

Представим интернет-магазин с двумя таблицами:

  • sales — информация о продажах
  • returns — информация о возвратах
-- Создаем таблицы для примера
CREATE TABLE sales (
    sale_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    amount DECIMAL(10,2),
    sale_date DATE
);

CREATE TABLE returns (
    return_id INT PRIMARY KEY,
    sale_id INT,
    return_reason VARCHAR(200),
    return_date DATE
);

Теперь заполним их тестовыми данными:

INSERT INTO sales VALUES
(1, 'Ноутбук', 999.99, '2023-01-15'),
(2, 'Смартфон', 599.99, '2023-02-20'),
(3, 'Наушники', 199.99, '2023-03-10');

INSERT INTO returns VALUES
(1, 1, 'Не подошел размер', '2023-02-01'),
(2, 3, 'Брак', '2023-03-15');

Полный анализ данных с FULL JOIN 📊

Теперь сделаем запрос, который покажет все продажи и все возвраты вместе:

SELECT 
    s.sale_id,
    s.product_name,
    s.amount,
    s.sale_date,
    r.return_reason,
    r.return_date
FROM sales s
FULL JOIN returns r ON s.sale_id = r.sale_id;
sale_id product_name amount sale_date return_reason return_date
1 Ноутбук 999.99 2023-01-15 Не подошел размер 2023-02-01
2 Смартфон 599.99 2023-02-20 NULL NULL
3 Наушники 199.99 2023-03-10 Брак 2023-03-15

Почему это круто? 🌟

  1. Полная картина данных — видим все записи из обеих таблиц
  2. NULL-значения явно указывают на отсутствие связи
  3. Гибкость анализа — можно легко найти:
    • Товары, которые продались, но не возвращались
    • Возвраты без информации о продаже (ошибки в данных)
    • Товары с возвратами и причины

Особенности FULL JOIN 🧐

  1. Производительность — работает медленнее INNER JOIN, так как обрабатывает больше данных
  2. Совместимость — не все СУБД поддерживают (например, MySQL требует использования LEFT JOIN + RIGHT JOIN UNION)
  3. Читаемость — запросы могут стать сложными, если соединять много таблиц

Практическое задание: Найдите нестыковки в данных 🔍

Попробуйте модифицировать наш пример, чтобы найти:

  1. Товары, которые были проданы, но не возвращались
  2. Возвраты, для которых нет записи о продаже (возможные ошибки)
-- Решение:
SELECT 
    s.sale_id,
    s.product_name,
    r.return_id
FROM sales s
FULL JOIN returns r ON s.sale_id = r.sale_id
WHERE s.sale_id IS NULL OR r.return_id IS NULL;

Когда использовать FULL JOIN? 🎯

Идеальные сценарии:

  • Анализ соответствия данных между системами
  • Сравнение двух источников информации
  • Поиск расхождений в данных
  • Объединение данных из независимых систем

Альтернатива для MySQL 🐬

Так как MySQL не поддерживает FULL JOIN напрямую, используйте комбинацию:

(SELECT * FROM таблица1 LEFT JOIN таблица2 ON условие)
UNION
(SELECT * FROM таблица1 RIGHT JOIN таблица2 ON условие)

Это даст тот же результат, что и FULL JOIN в других СУБД.

Скрыть рекламу навсегда

📘 VK Видео — обучение без ограничений

Все уроки доступны без VPN, без блокировок и зависаний.

Можно смотреть с телефона, планшета или компьютера — в любое время.

▶️ Смотреть на VK Видео