Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает UNION ALL
Основное определение
UNION ALL — это оператор SQL, который объединяет результаты двух или более SELECT запросов в один набор строк. Главное отличие от UNION в том, что UNION ALL сохраняет все строки, включая дубликаты, а обычный UNION удаляет дубликаты.
Синтаксис
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
Практические примеры
Базовый пример
-- Таблица сотрудников офиса в Москве
SELECT name, salary FROM moscow_employees
UNION ALL
-- Таблица сотрудников офиса в Санкт-Петербурге
SELECT name, salary FROM spb_employees;
Результат: все сотрудники из обоих офисов в одной таблице.
С данными
Таблица moscow_employees:
| name | salary |
|---|---|
| Иван | 100000 |
| Мария | 110000 |
Таблица spb_employees:
| name | salary |
|---|---|
| Петр | 95000 |
| Мария | 110000 |
Запрос:
SELECT name, salary FROM moscow_employees
UNION ALL
SELECT name, salary FROM spb_employees;
Результат UNION ALL:
| name | salary |
|---|---|
| Иван | 100000 |
| Мария | 110000 |
| Петр | 95000 |
| Мария | 110000 |
Если бы использовали UNION (без ALL):
| name | salary |
|---|---|
| Иван | 100000 |
| Мария | 110000 |
| Петр | 95000 |
Требования и правила
- Количество столбцов должно совпадать
# Ошибка: разное количество столбцов
SELECT id, name FROM users
UNION ALL
SELECT id, name, email FROM products; # 3 столбца
- Типы данных столбцов должны быть совместимы
-- OK: оба INT
SELECT user_id FROM users
UNION ALL
SELECT customer_id FROM customers;
-- Может быть проблема
SELECT user_id FROM users -- INT
UNION ALL
SELECT email FROM accounts; -- VARCHAR
- Порядок столбцов важен, названия берутся из первого SELECT
SELECT id AS user_id, name AS user_name FROM users
UNION ALL
SELECT id, name FROM products; -- Названия берутся из первого запроса
UNION ALL vs UNION
| Оператор | Дубликаты | Производительность | Использование |
|---|---|---|---|
| UNION ALL | Сохраняет | Быстрее | Когда дубликаты важны или их нет |
| UNION | Удаляет | Медленнее (сортирует) | Когда нужны только уникальные |
УНИОН производит сортировку данных для поиска дубликатов, поэтому медленнее.
Реальные примеры использования
Объединение данных из разных таблиц истории
-- Все транзакции: старые в таблице archive, новые в текущей
SELECT transaction_id, amount, date FROM transactions_archive
WHERE date < '2023-01-01'
UNION ALL
SELECT transaction_id, amount, date FROM transactions
WHERE date >= '2023-01-01'
ORDER BY date DESC;
Объединение результатов из разных источников
-- Все заказы: свои и партнёров
SELECT order_id, status, 'own' AS source FROM own_orders
UNION ALL
SELECT order_id, status, 'partner' AS source FROM partner_orders
WHERE status != 'cancelled';
Временный расширенный датасет
-- Все активные и недавно деактивированные пользователи
SELECT id, name, 'active' AS status FROM users WHERE is_active = true
UNION ALL
SELECT id, name, 'inactive' AS status FROM users
WHERE is_active = false AND deactivated_at > NOW() - INTERVAL '30 days';
Производительность
# UNION ALL быстрее, так как не удаляет дубликаты
SELECT * FROM users
UNION ALL # Работает сразу
SELECT * FROM admins;
# UNION медленнее из-за удаления дубликатов
SELECT * FROM users
UNION # Сортирует, ищет дубликаты
SELECT * FROM admins;
Совет: если тебе не нужны уникальные строки, используй UNION ALL — это значительно быстрее.
Частые ошибки
❌ Забыли ALL и теперь запрос работает медленно:
SELECT city FROM customers
UNION -- Ищет дубликаты, медленно
SELECT city FROM orders;
✅ Используем ALL если знаем, что дубликаты нужны:
SELECT city FROM customers
UNION ALL -- Быстро, сохраняет все
SELECT city FROM orders;