В чем разница между операторами SQL UNION и UNION ALL?

Ответ

Операторы UNION и UNION ALL в SQL используются для объединения результатов двух или более SELECT-запросов. Главное различие между ними заключается в обработке дублирующихся строк и, как следствие, в производительности.

Важное условие: Все SELECT-запросы в объединении должны иметь одинаковое количество столбцов, а типы данных в соответствующих столбцах должны быть совместимы.

UNION

Оператор UNION объединяет результаты и удаляет все дубликаты строк. Для этого СУБД выполняет дополнительную работу: она сортирует объединенный набор данных и отфильтровывает повторяющиеся строки. Это похоже на выполнение SELECT DISTINCT над итоговым результатом.

UNION ALL

Оператор UNION ALL просто объединяет результаты запросов, включая все дубликаты. Он не выполняет никакой проверки на уникальность, поэтому работает значительно быстрее и потребляет меньше ресурсов (памяти и CPU).

Сравнительная таблица

Критерий UNION UNION ALL
Обработка дубликатов Удаляет дубликаты Сохраняет все дубликаты
Производительность Медленнее (из-за сортировки и фильтрации) Быстрее (простое объединение)
Использование ресурсов Выше Ниже

Пример

Предположим, у нас есть две таблицы: employees и archived_employees.

-- Таблица employees
-- id | name
-- 1  | 'Анна'
-- 2  | 'Иван'

-- Таблица archived_employees
-- id | name
-- 2  | 'Иван'
-- 3  | 'Петр'

Запрос с UNION ALL (быстрый, с дубликатами):

SELECT name FROM employees
UNION ALL
SELECT name FROM archived_employees;

Результат:

'Анна'
'Иван'
'Иван'  -- Дубликат сохранен
'Петр'

Запрос с UNION (медленнее, без дубликатов):

SELECT name FROM employees
UNION
SELECT name FROM archived_employees;

Результат:

'Анна'
'Иван'  -- Дубликат удален
'Петр'

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

  • UNION ALL — ваш выбор по умолчанию, особенно для больших объемов данных, если вы уверены, что дубликатов нет, или если они допустимы в результате.
  • UNION — используйте только тогда, когда вам гарантированно нужен набор уникальных строк.