Как объединить результаты двух запросов в SQL (UNION)?
У меня есть таблица текущих клиентов и таблица архивных. Хочу получить один общий список имён из обеих. Как объединить результаты двух SELECT в SQL? Чем UNION отличается от UNION ALL?
2 ответа
Склеить результаты двух запросов «друг под друга» (по строкам) помогает оператор UNION:
SELECT name, email FROM customers
UNION
SELECT name, email FROM archived_customers;
Главное различие:
- UNION — объединяет и удаляет дубликаты (одинаковые строки останутся в одном экземпляре).
- UNION ALL — объединяет со всеми повторами, ничего не убирает, и поэтому работает быстрее (не тратит время на поиск дублей).
Если дубликаты невозможны или не мешают — берите UNION ALL, он эффективнее.
Жёсткие требования к запросам в UNION:
- Одинаковое число столбцов в каждом SELECT.
- Совместимые типы столбцов по позициям (текст к тексту, число к числу).
- Имена колонок берутся из первого запроса — алиасы во втором игнорируются.
ORDER BY пишется один раз в самом конце и сортирует уже объединённый результат:
SELECT name FROM customers
UNION ALL
SELECT name FROM archived_customers
ORDER BY name;
Частая путаница: UNION объединяет по вертикали (добавляет строки), а JOIN — по горизонтали (добавляет столбцы). Если вам нужно подтянуть данные из связанной таблицы в те же строки — это JOIN, а не UNION.
Маленькое, но частое предостережение: не пытайтесь объединять UNION-ом запросы с разным числом или смыслом столбцов, «лишь бы влезло». Если в первом 2 столбца, а во втором 3 — будет ошибка. А если число совпало, но смысл разный (в одном email, в другом телефон в той же позиции) — ошибки не будет, но получится бессмыслица. Следите, чтобы колонки по позициям были однотипными по сути.