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 ждет тебя, если ты тоже хочешь познакомиться с базовым языком для аналитики данных. Подписывайся!




