← Назад к вопросам

Как работает UNION ALL?

2.0 Middle🔥 191 комментариев
#Базы данных (SQL)

Комментарии (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:

namesalary
Иван100000
Мария110000

Таблица spb_employees:

namesalary
Петр95000
Мария110000

Запрос:

SELECT name, salary FROM moscow_employees
UNION ALL
SELECT name, salary FROM spb_employees;

Результат UNION ALL:

namesalary
Иван100000
Мария110000
Петр95000
Мария110000

Если бы использовали UNION (без ALL):

namesalary
Иван100000
Мария110000
Петр95000

Требования и правила

  1. Количество столбцов должно совпадать
# Ошибка: разное количество столбцов
SELECT id, name FROM users
UNION ALL
SELECT id, name, email FROM products;  # 3 столбца
  1. Типы данных столбцов должны быть совместимы
-- 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
  1. Порядок столбцов важен, названия берутся из первого 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;