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— объединение с удалением дубликатов- Оба оператора требуют одинаковой структуры результатов
- Выбор между ними зависит от конкретной задачи