UNION и UNION ALL: объединение результатов нескольких запросов

Зачем объединять результаты запросов?

В реальной работе часто возникает необходимость собрать данные из разных источников в одну результирующую таблицу. Например:

  • Получить список всех клиентов из разных регионов
  • Объединить архивные данные с актуальными
  • Собрать статистику из нескольких таблиц с одинаковой структурой

Для этих задач SQL предлагает два мощных оператора: UNION и UNION ALL.


UNION ALL: простое объединение без проверки

UNION ALL — самый простой способ объединить результаты. Он работает по принципу «склейки»:

  • Сохраняет все строки из всех запросов
  • Не проверяет на дубликаты
  • Выполняется быстрее, чем UNION (не нужно сортировать и сравнивать)
-- Пример: объединяем списки клиентов из двух филиалов
SELECT client_name, phone FROM north_branch_clients
UNION ALL
SELECT client_name, phone FROM south_branch_clients;

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

  • Когда дубликаты не мешают или даже полезны
  • Когда нужно максимальное быстродействие
  • Когда точно знаете, что дубликатов нет

UNION: объединение с удалением дубликатов

UNION делает то же самое, но с важным отличием:

  • Удаляет полностью одинаковые строки
  • Требует сортировки результатов (это влияет на производительность)
  • Сохраняет только уникальные записи
-- Пример: получаем уникальные города из двух таблиц
SELECT city FROM suppliers
UNION
SELECT city FROM customers;

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

  • Когда нужны только уникальные значения
  • Когда дубликаты искажают результаты
  • Готовы пожертвовать скоростью ради точности

Важные правила объединения

1. Совместимость типов данных:

-- Не сработает: разные типы данных
SELECT product_id FROM products  -- число
UNION
SELECT product_name FROM products;  -- строка

2. Количество столбцов должно совпадать:

-- Ошибка: разное число столбцов
SELECT id, name FROM employees
UNION
SELECT department FROM departments;

3. Порядок столбцов имеет значение:

-- Данные будут "склеены" по позиции столбца
SELECT name, age FROM students
UNION
SELECT title, year FROM books;  -- name=title, age=year

Практические примеры из реальной жизни

Пример 1: Сводный отчёт по продажам

-- Объединяем продажи за разные периоды
SELECT '2023-Q1' as period, SUM(amount) as total 
FROM sales_q1_2023
UNION ALL
SELECT '2023-Q2' as period, SUM(amount) as total 
FROM sales_q2_2023
ORDER BY period;

Пример 2: Поиск общих контактов

-- Находим клиентов, которые были и поставщиками
SELECT contact_name, phone FROM clients
UNION
SELECT contact_name, phone FROM suppliers
ORDER BY contact_name;

Производительность: UNION vs UNION ALL

Тест скорости (на больших таблицах):

  • UNION ALL выполняется в 2-3 раза быстрее
  • UNION требует дополнительных ресурсов для сортировки и дедупликации

💡 Совет от Данилы Бежина (https://www.youtube.com/@DanilaBezhin):

"Всегда начинайте с UNION ALL и переходите к UNION только когда точно уверены, что дубликаты мешают. Это простой способ оптимизации запросов!"


Итоги

  • UNION ALL — быстрое объединение «как есть»
  • UNION — объединение с удалением дубликатов
  • Оба оператора требуют одинаковой структуры результатов
  • Выбор между ними зависит от конкретной задачи
Скрыть рекламу навсегда

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

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

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

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