Ответ
Операторы 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
— используйте только тогда, когда вам гарантированно нужен набор уникальных строк.