Чем оператор UNION ALL отличается от UNION в SQL?

Ответ

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

Оператор Обработка дубликатов Производительность Использование
UNION ALL Сохраняет все дубликаты из всех исходных наборов. Быстрее, так как не требует дополнительной обработки для удаления дублей. Когда наличие повторяющихся строк допустимо или когда известно, что их нет.
UNION Удаляет дубликаты из конечного результата. Медленнее, потому что база данных должна выполнить сортировку и дедупликацию. Когда в результате необходимы только уникальные строки.

Пример, наглядно показывающий разницу:

-- Исходные данные:
-- Таблица A: (1, 'Alice'), (2, 'Bob')
-- Таблица B: (2, 'Bob'), (3, 'Charlie')

-- UNION ALL: вернет 4 строки, включая двух 'Bob'
SELECT id, name FROM A
UNION ALL
SELECT id, name FROM B;
-- Результат: (1,'Alice'), (2,'Bob'), (2,'Bob'), (3,'Charlie')

-- UNION: вернет 3 уникальные строки
SELECT id, name FROM A
UNION
SELECT id, name FROM B;
-- Результат: (1,'Alice'), (2,'Bob'), (3,'Charlie')

Правило выбора: Всегда используйте UNION ALL, если вам не нужна дедупликация. Это даст значительный прирост производительности на больших объемах данных.

Ответ 18+ 🔞

Давай разберём эту базу данных, как последнюю пачку пельменей в холодильнике. Тут два оператора, UNION и UNION ALL, вроде как близнецы, но один — спокойный работяга, а второй — истеричка с перфекционизмом.

Смотри, оба они склеивают результаты нескольких SELECT-запросов. Но их главная разница — в отношении к дублям, вот в чём, блядь, соль!

  • UNION ALL — это пофигист. Ему похуй на повторения. Взял все строки из первой выборки, взял все из второй, склеил — и в ус не дует. Быстро, просто, никакого геморроя.
  • UNION — это невротик-чистюля. Он не может видеть две одинаковые строки рядом. Поэтому он берёт весь этот срач, который получился после склейки, и начинает его сортировать и выкидывать дубликаты. Это, ясное дело, требует времени и ресурсов.

Короче, табличка для наглядности:

Оператор Что делает с дублями? Скорость Когда юзать?
UNION ALL Оставляет как есть. Дважды «Боб»? И хуй с ним, пусть будут два Боба! Быстро, ебать! Не тратит время на ерунду. Когда дубли тебе не мешают или ты на 100% уверен, что их нет.
UNION Выносит их мозг и удаляет. Два «Боба»? Один лишний — нахуй! Медленнее, пиздец. Потому что сортировка и дедупликация — это дополнительные телодвижения. Когда в результате нужны только уникальные, неповторяющиеся записи.

Смотри, как это выглядит вживую:

-- Допустим, есть у нас:
-- Таблица A: (1, 'Алиса'), (2, 'Боб')
-- Таблица B: (2, 'Боб'), (3, 'Чарли')

-- UNION ALL: вернёт всё, что видит. 4 строки, и Боб там будет дважды, как сосед-алкаш у подъезда.
SELECT id, name FROM A
UNION ALL
SELECT id, name FROM B;
-- Итог: (1,'Алиса'), (2,'Боб'), (2,'Боб'), (3,'Чарли')

-- UNION: наведёт марафет. 3 уникальные строки, один Боб — и хватит.
SELECT id, name FROM A
UNION
SELECT id, name FROM B;
-- Итог: (1,'Алиса'), (2,'Боб'), (3,'Чарли')

Главное правило, которое спасёт тебе кучу времени: если тебе не нужно убирать дубли — всегда, блядь, всегда используй UNION ALL. Это как ехать на работу напрямую, а не через три района с пробками. На больших данных разница в скорости — просто овердохуищная. Не заставляй базу данных заниматься ерундой без причины!