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

Что делает оператор UNION в SQL?

1.0 Junior🔥 251 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что делает оператор UNION в SQL?

UNION — это оператор SQL, который объединяет результаты двух или более SELECT запросов в один результирующий набор. UNION удаляет дубликаты по умолчанию, в отличие от UNION ALL, который сохраняет все строки.

Базовый синтаксис UNION

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

Требования к UNION:

  • Количество столбцов должно быть одинаковым в обоих SELECT запросах
  • Типы данных столбцов должны быть совместимы
  • Порядок столбцов важен (результат берёт имена из первого SELECT)

UNION vs UNION ALL

UNION (удаляет дубликаты)

SELECT id, name FROM employees
WHERE department = 'Sales'
UNION
SELECT id, name FROM employees
WHERE department = 'Marketing';

Результат: если один сотрудник работает в обоих отделах, он появится один раз.

id | name
---|-------
1  | Alice
2  | Bob
3  | Charlie

UNION ALL (сохраняет дубликаты)

SELECT id, name FROM employees
WHERE department = 'Sales'
UNION ALL
SELECT id, name FROM employees
WHERE department = 'Marketing';

Результат: все сотрудники, включая дубликаты.

id | name
---|-------
1  | Alice
2  | Bob
2  | Bob
3  | Charlie

Практические примеры

1. Объединение данных из разных таблиц

-- Получить контакты всех клиентов (email из одной таблицы, телефон из другой)
SELECT email FROM customer_emails
UNION
SELECT phone FROM customer_phones;

2. Объединение результатов с разными условиями

-- Клиенты с большими заказами ИЛИ высоким баллом VIP
SELECT customer_id FROM orders
WHERE total_amount > 10000
UNION
SELECT customer_id FROM vip_members
WHERE loyalty_score > 5000;

3. Комбинирование данных разных периодов

-- Продажи за июнь и июль
SELECT product_id, SUM(amount) as total
FROM sales
WHERE DATE_TRUNC('month', date) = '2024-06-01'
GROUP BY product_id
UNION ALL
SELECT product_id, SUM(amount) as total
FROM sales
WHERE DATE_TRUNC('month', date) = '2024-07-01'
GROUP BY product_id;

4. Поиск различий между таблицами

-- Сотрудники, которые есть в active_employees, но нет в payroll_employees
SELECT id, name FROM active_employees
UNION
SELECT id, name FROM payroll_employees
-- Затем можно фильтровать или анализировать результаты

Производительность и оптимизация

UNION быстрее или медленнее?

-- Вариант 1: UNION (удаляет дубликаты)
SELECT id FROM table1
WHERE condition1
UNION
SELECT id FROM table2
WHERE condition2;

-- Вариант 2: UNION ALL (без удаления дубликатов)
SELECT id FROM table1
WHERE condition1
UNION ALL
SELECT id FROM table2
WHERE condition2;

-- Вариант 3: объединение в подзапросе
SELECT DISTINCT id FROM (
    SELECT id FROM table1 WHERE condition1
    UNION ALL
    SELECT id FROM table2 WHERE condition2
) combined_data;

UNION медленнее, чем UNION ALL, потому что:

  • UNION требует сортировки для идентификации дубликатов
  • UNION требует дополнительной памяти для хранения временных результатов
  • UNION ALL просто конкатенирует результаты без обработки

Используйте UNION ALL, если дубликаты не критичны.

UNION с ORDER BY и LIMIT

-- Отсортировать объединённые результаты
SELECT id, name, 'table1' as source FROM table1
UNION
SELECT id, name, 'table2' as source FROM table2
ORDER BY name;

-- Ограничить результаты
SELECT id, name FROM table1
UNION
SELECT id, name FROM table2
LIMIT 10;

Отличие от JOIN

UNION vs JOIN:

-- UNION: комбинирует СТРОКИ из разных таблиц
SELECT name FROM users
UNION
SELECT product_name FROM products;

-- JOIN: комбинирует СТОЛБЦЫ из разных таблиц
SELECT users.name, orders.product_name
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Ключевое различие:

  • UNION — вертикальное объединение (добавляет строки)
  • JOIN — горизонтальное объединение (добавляет столбцы)

Сложные примеры для Data Scientist

1. Анализ данных из нескольких источников

-- Объединить данные о пользователях из web и мобильного приложения
SELECT 
    user_id,
    email,
    registration_date,
    'web_app' as source
FROM web_users
UNION ALL
SELECT 
    user_id,
    email,
    registration_date,
    'mobile_app' as source
FROM mobile_users;

2. Создание выборки для обучения модели

-- Положительные примеры: заказы > $100 (клики)
SELECT 
    user_id, product_id, 1 as clicked
FROM purchases
WHERE amount > 100
UNION ALL
-- Отрицательные примеры: просмотры без покупки (нет кликов)
SELECT 
    user_id, product_id, 0 as clicked
FROM views
WHERE view_id NOT IN (SELECT view_id FROM purchases);

3. Обработка данных с UNION и агрегацией

WITH combined_data AS (
    SELECT user_id, amount, 'order' as type FROM orders
    UNION ALL
    SELECT user_id, amount, 'refund' as type FROM refunds
)
SELECT 
    user_id,
    type,
    COUNT(*) as count,
    SUM(amount) as total_amount
FROM combined_data
GROUP BY user_id, type;

Лучшие практики

  1. Используйте UNION ALL, если дубликаты приемлемы — это быстрее
  2. Явно указывайте столбцы — не используйте SELECT *
  3. Используйте понятные имена столбцов — задавайте алиасы если нужно
  4. Проверяйте типы данных — убедитесь в совместимости
  5. Документируйте, что делает каждый SELECT — добавляйте комментарии
-- ✅ Хорошо
SELECT 
    user_id, 
    email, 
    'customer' as user_type
FROM customers
UNION ALL
SELECT 
    user_id, 
    email, 
    'supplier' as user_type
FROM suppliers;

-- ❌ Плохо
SELECT * FROM customers
UNION ALL
SELECT * FROM suppliers;

Заключение

UNION — мощный оператор для объединения результатов из разных таблиц или запросов с разными условиями. Правильное использование UNION критично для:

  • Эффективного анализа данных из несколько источников
  • Создания обучающих датасетов для моделей машинного обучения
  • Деинтегрирования данных из различных систем