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

Что такое UNION?

2.0 Middle🔥 21 комментариев
#DevOps и инфраструктура#Django

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

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

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

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 запросов

  1. Используйте UNION ALL вместо UNION, если дубликаты невозможны
  2. Ограничивайте результаты — используйте WHERE перед UNION
  3. Индексируйте столбцы, используемые в UNION запросах
  4. Избегайте 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 — это мощный инструмент для объединения данных из нескольких источников, но требует внимания к производительности при работе с большими объёмами данных.

Что такое UNION? | PrepBro