Комментарии (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;
Лучшие практики
- Используйте UNION ALL, если дубликаты приемлемы — это быстрее
- Явно указывайте столбцы — не используйте SELECT *
- Используйте понятные имена столбцов — задавайте алиасы если нужно
- Проверяйте типы данных — убедитесь в совместимости
- Документируйте, что делает каждый 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 критично для:
- Эффективного анализа данных из несколько источников
- Создания обучающих датасетов для моделей машинного обучения
- Деинтегрирования данных из различных систем