Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
UNION в SQL
UNION — это SQL оператор, который объединяет результаты двух или нескольких SELECT запросов в один результирующий набор. UNION удаляет дублирующиеся строки из объединённого набора (если явно не указано иное). Это полезно при необходимости получить данные из нескольких таблиц или выполнить несколько запросов и вернуть результаты вместе.
Синтаксис
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
Требования:
- Оба SELECT запроса должны возвращать одинаковое количество столбцов
- Типы данных соответствующих столбцов должны совпадать или быть совместимыми
- Имена столбцов берутся из первого SELECT
Пример: объединение данных пользователей
Представим, что у нас есть таблицы активных и неактивных пользователей:
-- Таблица активных пользователей
CREATE TABLE active_users (
id INTEGER,
name VARCHAR(100),
email VARCHAR(100),
status VARCHAR(20)
);
-- Таблица неактивных пользователей (архив)
CREATE TABLE inactive_users (
id INTEGER,
name VARCHAR(100),
email VARCHAR(100),
status VARCHAR(20)
);
-- Получить всех пользователей
SELECT id, name, email, status FROM active_users
UNION
SELECT id, name, email, status FROM inactive_users;
Результат будет содержать уникальные комбинации строк из обеих таблиц.
UNION vs UNION ALL
UNION удаляет дублирующиеся строки (медленнее, требует сортировки):
SELECT 'Apple' as fruit
UNION
SELECT 'Apple';
-- Результат: 1 строка (Apple)
UNION ALL сохраняет все строки, включая дубликаты (быстрее):
SELECT 'Apple' as fruit
UNION ALL
SELECT 'Apple';
-- Результат: 2 строки (Apple, Apple)
Если вы уверены, что дубликатов не будет, используйте UNION ALL для лучшей производительности.
Практические примеры
Объединение заказов из разных магазинов:
SELECT order_id, customer_name, amount, 'Store A' as store
FROM store_a_orders
WHERE order_date > '2024-01-01'
UNION
SELECT order_id, customer_name, amount, 'Store B' as store
FROM store_b_orders
WHERE order_date > '2024-01-01'
ORDER BY amount DESC;
Объединение данных из разных источников:
-- Получить все события: и из таблицы логов, и из таблицы аудита
SELECT user_id, action, created_at FROM logs
WHERE action_type = 'login'
UNION
SELECT user_id, event_type as action, timestamp as created_at
FROM audit_events
WHERE event_type = 'login';
Использование UNION с фильтрацией
-- Найти customers, которые либо купили что-то, либо оставили отзыв
SELECT DISTINCT customer_id, 'buyer' as status
FROM orders
WHERE order_date > '2024-01-01'
UNION
SELECT DISTINCT customer_id, 'reviewer' as status
FROM reviews
WHERE review_date > '2024-01-01'
ORDER BY customer_id;
UNION с Python и SQLAlchemy
from sqlalchemy import select, union
from models import ActiveUser, InactiveUser
# Запрос активных пользователей
active_query = select(ActiveUser.id, ActiveUser.name, ActiveUser.email)
# Запрос неактивных пользователей
inactive_query = select(InactiveUser.id, InactiveUser.name, InactiveUser.email)
# Объединение
combined_query = union(active_query, inactive_query)
# Выполнение
results = session.execute(combined_query).fetchall()
for row in results:
print(f"ID: {row.id}, Name: {row.name}, Email: {row.email}")
С UNION ALL:
from sqlalchemy import union_all
combined_query = union_all(active_query, inactive_query)
Другие операции объединения
EXCEPT — строки из первого запроса, которых нет во втором:
SELECT customer_id FROM orders
EXCEPT
SELECT customer_id FROM refunded_orders;
INTERSECT — только строки, присутствующие в обоих запросах:
SELECT customer_id FROM active_users
INTERSECT
SELECT customer_id FROM recent_buyers;
Оптимизация UNION запросов
- Используйте UNION ALL вместо UNION, если дубликаты невозможны
- Ограничивайте результаты — используйте WHERE перед UNION
- Индексируйте столбцы, используемые в UNION запросах
- Избегайте UNION для больших таблиц — используйте JOIN если возможно
-- Плохо: UNION для больших таблиц
SELECT * FROM users WHERE status = 'active'
UNION
SELECT * FROM users WHERE status = 'pending';
-- Хорошо: используем OR
SELECT * FROM users WHERE status IN ('active', 'pending');
UNION — это мощный инструмент для объединения данных из нескольких источников, но требует внимания к производительности при работе с большими объёмами данных.