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

Ответ 18+ 🔞

А, ну это же про эти ваши UNION и UNION ALL! Давай разжую, как есть, чтобы даже мартышлюшка поняла.

Представь, что у тебя два ведра с хуями — прости, с данными. UNION ALL — это когда ты тупо вываливаешь содержимое обоих ведер в одну кучу. Был Иван в первом ведре и Иван во втором? Похуй, будет два Ивана в общей куче. Быстро, просто, без мозгоёбства.

А вот UNION — это уже хитрая жопа. Он тоже вываливает всё в кучу, но потом начинает там ковыряться: «Так-так, а это что за повтор? Два Ивана? Нахуй один!». И начинает сортировать, сравнивать, отсеивать дубли. Работает, блядь, медленнее, ресурсов жрёт овердохуища. Это как SELECT DISTINCT на стероидах для бедных.

Короче, памятка для чайников:

  • UNION ALL — «Да похуй, сливай всё!» Быстро.
  • UNION — «Ой, подожди, тут же повторы... Надо убрать...» Медленно.

Смотри, пример, чтоб совсем пиздец понятно стало. Есть таблицы employees и archived_employees.

-- Быстро и в лоб, как таран. Всех скопом, даже если Иван встретился дважды.
SELECT name FROM employees
UNION ALL
SELECT name FROM archived_employees;

Выдаст: Анна, Иван, Иван (опять), Петр. Дубли на месте.

-- А это уже с придурью. «Так, Иван... Иван... Один Иван лишний, нахуя?»
SELECT name FROM employees
UNION
SELECT name FROM archived_employees;

Выдаст: Анна, Иван (только один, блядь), Петр. Лишнего замочил.

Итог, чувак: если тебе похуй на дубли или ты знаешь, что их нет — юзай UNION ALL, не гони волну. UNION — только если реально надо выковыривать уникальные значения, и ты готов за это заплатить скоростью. Всё, рот меня чих-пых, вопрос закрыт.