UNION и UNION ALL выглядят почти одинаково, но ведут себя по-разному. На практике это влияет и на результат, и на производительность.
Ключевая разница:
UNIONобъединяет результаты и убирает дубликатыUNION ALLобъединяет результаты и оставляет все строки как есть
Если это понять, выбор между ними становится очень простым.
Самый короткий пример
SELECT 1
UNION
SELECT 1
Результат:
1
А теперь так:
SELECT 1
UNION ALL
SELECT 1
Результат:
1
1
Вот и вся базовая разница.
Что делает UNION
UNION работает как “объединить и оставить только уникальные строки”.
Например:
SELECT customer_id
FROM online_orders
UNION
SELECT customer_id
FROM offline_orders
Если один и тот же клиент встречается в обеих таблицах, в результате он будет один раз.
Это удобно, когда нужен именно набор уникальных значений.
Что делает UNION ALL
UNION ALL просто складывает один результат под другой без дополнительной обработки.
SELECT customer_id
FROM online_orders
UNION ALL
SELECT customer_id
FROM offline_orders
Если один и тот же клиент есть в обеих таблицах, он попадет в результат дважды.
Это удобно, когда тебе важны все строки, включая повторы.
Почему UNION обычно медленнее
Потому что UNION должен еще найти и убрать дубликаты.
Обычно для этого СУБД:
- сортирует данные
- или строит внутреннюю структуру для поиска повторов
А UNION ALL ничего такого не делает. Он просто склеивает результаты.
Поэтому практическое правило такое:
- если дубликаты не мешают или даже нужны, почти всегда лучше
UNION ALL UNIONиспользуй только тогда, когда действительно нужен уникальный результат
Частая ошибка №1: использовать UNION “на автомате”
Очень многие пишут UNION, хотя по смыслу нужен UNION ALL.
Например, ты хочешь объединить продажи за январь и февраль:
SELECT order_id, amount
FROM sales_january
UNION ALL
SELECT order_id, amount
FROM sales_february
Здесь обычно нужен именно UNION ALL, потому что:
- ты складываешь два набора событий
- одинаковые строки могут быть реальными
- тебе не надо случайно терять данные
Если написать UNION, можно незаметно удалить часть строк.
Частая ошибка №2: думать, что дубликат определяется по одному столбцу
Важно: UNION убирает дубликаты по всей строке, а не по отдельному полю.
Пример:
SELECT 1 AS id, 'A' AS source
UNION
SELECT 1 AS id, 'B' AS source
Результат будет:
1 A
1 B
Почему обе строки остались? Потому что полностью они разные.
Когда использовать UNION
Используй UNION, если тебе нужны именно уникальные записи.
Например:
- список всех уникальных пользователей из нескольких источников
- все уникальные email
- список всех категорий из разных таблиц
Пример:
SELECT email FROM leads
UNION
SELECT email FROM customers
UNION
SELECT email FROM subscribers
Здесь логика понятна: нужен единый уникальный список email.
Когда использовать UNION ALL
Используй UNION ALL, если тебе важен полный поток строк:
- события
- транзакции
- логи
- продажи из разных таблиц
- данные по месяцам, которые надо сложить вместе
Пример:
SELECT event_time, user_id, event_name
FROM events_mobile
UNION ALL
SELECT event_time, user_id, event_name
FROM events_web
В аналитике это очень частый кейс.
Можно ли сделать UNION ALL, а потом DISTINCT
Да, и иногда это удобнее.
Например:
SELECT DISTINCT customer_id
FROM (
SELECT customer_id FROM online_orders
UNION ALL
SELECT customer_id FROM offline_orders
) t
С точки зрения логики это то же самое, что и UNION.
Иногда такой вариант удобнее:
- когда нужно сначала склеить несколько источников
- потом еще что-то посчитать
- и только в финале убрать дубликаты
Важное правило по структуре
Для UNION и UNION ALL в обеих частях запроса должно совпадать:
- количество столбцов
- порядок столбцов
- совместимые типы данных
Например:
SELECT id, name
FROM table_1
UNION ALL
SELECT id, name
FROM table_2
Если в одном запросе 2 столбца, а в другом 3, будет ошибка.
Как быстро запомнить
Простая запоминалка:
UNION= объединить и очистить повторыUNION ALL= просто объединить все
И практическое правило:
- по умолчанию сначала подумай про
UNION ALL UNIONиспользуй только если действительно надо убрать дубликаты
Итог
Разница между UNION и UNION ALL в SQL очень практичная:
UNIONубирает дубликатыUNION ALLсохраняет все строки
Из-за дополнительной обработки UNION обычно медленнее, поэтому в аналитике UNION ALL часто является более безопасным и более честным выбором.
Если тебе нужны все строки, не убивай их UNION “на автомате”.