UNION и UNION ALL на собеседовании аналитика
Зачем спрашивают UNION на собеседовании
UNION кажется простой операцией: объединить результаты двух запросов. Но именно простота создаёт ловушки. Интервьюеры проверяют, понимаете ли вы разницу между UNION и UNION ALL, знаете ли о влиянии на производительность и можете ли применить операцию в реальных аналитических задачах.
Вопросы по UNION встречаются на собеседованиях всех уровней. Для junior это проверка базовых знаний, для middle и senior — повод обсудить оптимизацию и архитектуру запросов.
UNION без ALL выполняет неявный DISTINCT по всем строкам результата. Это значит сортировку и дедупликацию — операции, которые на больших таблицах могут стоить минуты. Если дубликаты не мешают, всегда используйте UNION ALL.
Разница между UNION и UNION ALL
UNION объединяет результаты двух запросов и удаляет дубликаты. Под капотом это сортировка или хеширование всего результата — дорогая операция. Используйте, когда действительно нужны уникальные строки: объединение списков пользователей из разных источников без повторов.
UNION ALL просто склеивает результаты без проверки на дубликаты. Работает значительно быстрее, потому что не требует дополнительной обработки. Это правильный выбор в большинстве аналитических задач: объединение логов, событий, транзакций из разных таблиц.
Оба оператора требуют одинаковое количество колонок в каждом SELECT и совместимые типы данных. Имена колонок берутся из первого запроса — это частый источник путаницы при отладке.
Производительность: почему это важно
На таблицах в миллионы строк разница между UNION и UNION ALL может быть в десятки раз. UNION запускает дедупликацию по всем колонкам — чем больше колонок и строк, тем дороже операция. Интервьюер может спросить: «Вы написали UNION — точно нужен DISTINCT? Или подойдёт UNION ALL?» Правильный ответ — обосновать выбор исходя из данных.
Ещё один нюанс: UNION сортирует данные для дедупликации, что может нарушить ожидаемый порядок строк. Если нужен конкретный порядок — добавьте ORDER BY после последнего SELECT.
Типичные задачи на собеседовании
Задача 1: Объединить активных пользователей из двух продуктов. Подход — UNION таблиц users_product_a и users_product_b по user_id. Здесь UNION оправдан, потому что один пользователь может быть в обоих продуктах, а в результате нужен уникальный список.
Задача 2: Собрать все события из шардированных таблиц. Подход — UNION ALL таблиц events_2024_q1, events_2024_q2 и так далее. Дубликаты невозможны — данные разделены по периодам.
Задача 3: Создать справочник с добавлением категории. Подход — SELECT с литералом 'online' для онлайн-заказов UNION ALL SELECT с литералом 'offline' для офлайн-заказов. Колонка-маркер позволяет различать источники в объединённом результате.
Задача 4: Найти пользователей, которые есть только в одной из двух таблиц. Подход — UNION ALL обеих таблиц, затем GROUP BY и HAVING COUNT(*) = 1. Альтернатива — EXCEPT, но интервьюер может попросить решить именно через UNION ALL.
Частые ошибки кандидатов
- Используют UNION вместо UNION ALL по привычке — лишняя дедупликация замедляет запрос и может скрыть реальные дубликаты в данных, которые стоило бы заметить.
- Путают порядок колонок — SQL сопоставляет колонки по позиции, а не по имени. Если в первом SELECT идёт user_id, amount, а во втором — amount, user_id, данные смешаются без ошибки.
- Забывают про типы данных — INTEGER и VARCHAR в одной позиции могут привести к неявному приведению типов или ошибке в зависимости от СУБД.
- Ставят ORDER BY в промежуточных SELECT — ORDER BY внутри отдельного SELECT перед UNION игнорируется. Сортировать нужно весь результат целиком, после последнего запроса.
Практическое правило: начинайте с UNION ALL и переключайтесь на UNION только когда дедупликация действительно нужна по условию задачи. Это покажет интервьюеру, что вы думаете о производительности.
FAQ
Когда UNION лучше UNION ALL?
Когда в результате нужны строго уникальные строки и источники данных могут пересекаться. Например, объединение списков клиентов из двух CRM-систем, где один клиент может быть в обеих. Во всех остальных случаях предпочитайте UNION ALL.
Можно ли объединить больше двух запросов?
Да, цепочка UNION ALL может включать любое количество SELECT. Порядок выполнения — сверху вниз, имена колонок берутся из первого запроса. На практике объединяют до десятков таблиц — например, шардированные логи по месяцам.
Чем UNION ALL отличается от JOIN?
UNION ALL добавляет строки — результат растёт вертикально. JOIN добавляет колонки — результат растёт горизонтально. Это фундаментально разные операции. UNION ALL требует одинаковую структуру колонок, JOIN требует условие соединения по ключу.