3

UNION vs UNION ALL

Почему одно объединение "умное", но медленное, другое - "тупое", но честное?

Обсудим сегодня эту тему.

UNION vs UNION ALL

А пока подписывайся на мой канал На связи: SQL Там я публикую посты про особенности и нюансы SQL. Этот канал про то, как не бояться баз данных, понимать, что такое JOIN, GROUP BY и почему NULL ≠ 0. Его я веду с нуля подписчиков. Присоединяйся!

UNION и UNION ALL.

На вид - почти одно и то же.
По смыслу - разные вещи.

И вот почему

UNION ALL — «тащит всё как есть»

UNION ALL просто берёт результаты двух запросов и клеит их друг под другом:

SELECT name FROM customers

UNION ALL

SELECT name FROM partners;

Никаких проверок, дубликатов, умностей.

- Если в обоих списках есть «Иван», то итоговый результат будет два «Ивана».
- Если порядок в исходных таблицах хаотичный, в результате он будет ещё хаотичнее.

UNION ALL = быстро + честно + без фильтров.

UNION - «умный, но медленный»

UNION делает то же самое, но перед тем как вернуть результат, он удаляет дубликаты:

SELECT name FROM customers

UNION

SELECT name FROM partners;

Чтобы убрать дубли, PostgreSQL/Oracle/MySQL вынуждены:

  • отсортировать результат

  • или построить hash-сет

  • и только потом вернуть данные

Это дорого.
На миллионах строк может стать тормозом №1 в отчёте.

UNION = красиво, чисто, но медленно.

Где использовать UNION?

✔ Когда действительно нужны уникальные значения

Например, получить список всех пользователей, независимо от источника:

SELECT user_id FROM old_system

UNION

SELECT user_id FROM new_system;

✔ Когда нужно исключить дубли после сложной логики

Например, когда запросы пересекаются, а ты не хочешь вручную писать DISTINCT.

Где использовать UNION ALL?

Практически везде, там где не надо удалять дубликаты, т.к. их по определению нет.
Например объединение отчетных данных за разные периоды.

SELECT * FROM sales_2024

UNION ALL

SELECT * FROM sales_2025;

Неочевидный факт: порядок строк не гарантируется

Ни в UNION, ни в UNION ALL.

Если хочешь порядок — дописывай: ORDER BY

Вывод:

  • UNION ALL — как корзина: «скидываем всё подряд».

  • UNION — как фильтр: «скидываем всё, но потом отбираем уникальное».

Мой канал На связи: SQL ждет тебя, если ты тоже хочешь познакомиться с базовым языком для аналитики данных. Подписывайся!