Read the book: «UNION в SQL. 18 задач на объединение таблиц»
Перед первой задачей
Зачем нужен UNION
UNION нужен, когда данные лежат в нескольких похожих таблицах или запросах, а в отчёте нужна одна общая лента строк.
Типичная ситуация: продажи за разные периоды, клиенты из разных источников, события сайта и приложения, старый и новый справочник.
Главная развилка проста: UNION убирает дубли, UNION ALL сохраняет всё. В отчёте это меняет не только внешний вид, но и итоговые числа.
Как не сломать объединение
У всех частей UNION должно быть одинаковое количество колонок в одинаковом порядке. Названия важны для читаемости, но структура важнее.
Сортировку обычно ставят в самом конце общего запроса. Если сортировать каждую часть отдельно, итоговый отчёт может остаться неупорядоченным.
Перед объединением полезно добавить колонку source. Тогда после UNION ALL видно, откуда пришла каждая строка.
Маршрут по задачам
1. Собрать клиентов из двух таблиц
2. Сохранить повторы через UNION ALL
3. Добавить источник каждой строки
4. Объединить старые и новые заказы
5. Собрать общий справочник категорий
6. Объединить события сайта и приложения
7. Посчитать строки после UNION ALL
8. Посчитать уникальные значения после UNION
9. Совместить разные названия колонок
10. Добавить пустую колонку для совместимости
11. Отфильтровать каждую часть перед объединением
12. Агрегировать общий поток
13. Объединить разные типы событий
14. Найти пересечение через UNION ALL и GROUP BY
15. Найти строки только из одного списка
16. Собрать отчёт с источником периода
17. Проверить совместимость типов
18. Собрать финальный отчёт из трёх потоков
Практические задачи
Задача 1. Собрать клиентов из двух таблиц
Рабочий вопрос
Нужно получить общий список email из двух источников клиентов и убрать повторяющиеся адреса.
Данные
CREATE TABLE buyers_2025(email TEXT);
CREATE TABLE buyers_2026(email TEXT);
INSERT INTO buyers_2025 VALUES ('anna@example.test'),('oleg@example.test');
INSERT INTO buyers_2026 VALUES ('oleg@example.test'),('nina@example.test');
Запрос
SELECT email FROM buyers_2025
UNION
SELECT email FROM buyers_2026
ORDER BY email;
Ожидаемый результат
[["anna@example.test"], ["nina@example.test"], ["oleg@example.test"]]
Почему работает
UNION объединяет строки из двух SELECT.
Повтор oleg@example.test остаётся один раз.
ORDER BY в конце сортирует уже общий результат.
Где легко ошибиться
UNION удаляет дубли. Если повторная покупка важна как отдельный факт, такой запрос может занизить количество событий.
Самостоятельная проверка
Почему oleg@example.test показан один раз, хотя есть в обеих исходных таблицах?
Ответ: Потому что UNION возвращает уникальные строки общего результата.