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 “на автомате”.