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

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

1.0 Junior🔥 161 комментариев
#Базы данных (SQL)

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

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

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

Как работает UNION в SQL

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

Синтаксис UNION

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

Основные характеристики

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

-- Объединение списков читателей из двух библиотек
SELECT name FROM library1_members
UNION
SELECT name FROM library2_members;

Этот запрос вернёт уникальные имена. Если одно имя есть в обеих таблицах, оно появится только один раз.

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

SELECT name FROM library1_members
UNION ALL
SELECT name FROM library2_members;

Вернёт все имена, включая дубликаты. Быстрее, чем UNION, потому что не нужно удалять дубликаты.

Требования для UNION

  1. Одинаковое количество столбцов в SELECT запросах
  2. Совместимые типы данных в соответствующих позициях
  3. Один порядок столбцов во всех запросах
# Корректный запрос
SELECT id, name FROM users
UNION
SELECT id, name FROM archived_users;

# Ошибка: разное количество столбцов
# SELECT id FROM users
# UNION
# SELECT id, name FROM archived_users;  # ERROR!

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

1. Объединение из нескольких таблиц:

SELECT id, email FROM users
UNION
SELECT id, email FROM administrators
UNION
SELECT id, email FROM guest_users;

2. С разными типами и значениями:

SELECT 
    user_id as id,
    email,
    "user" as type
FROM users
UNION
SELECT
    admin_id as id,
    admin_email as email,
    "admin" as type
FROM admins;

3. Комбинирование с WHERE:

SELECT name FROM employees WHERE salary > 5000
UNION
SELECT name FROM contractors WHERE daily_rate > 200;

4. С ORDER BY (применяется ко всему результату):

SELECT name, salary FROM employees
UNION
SELECT name, rate FROM contractors
ORDER BY salary DESC;

UNION vs UNION ALL

-- Таблица 1: users
id  name
1   Alice
2   Bob

-- Таблица 2: members
id  name
2   Bob
3   Charlie

-- UNION (без дубликатов)
SELECT name FROM users
UNION
SELECT name FROM members;
-- Результат: Alice, Bob, Charlie (3 строки)

-- UNION ALL (с дубликатами)
SELECT name FROM users
UNION ALL
SELECT name FROM members;
-- Результат: Alice, Bob, Bob, Charlie (4 строки)

UNION vs JOIN

UNION объединяет результаты вертикально (строки друг под другом):

SELECT name FROM table1
UNION
SELECT name FROM table2;
-- Результат: список имён из обеих таблиц

JOIN объединяет данные горизонтально (столбцы рядом):

SELECT t1.name, t2.email
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id;
-- Результат: имена с соответствующими email

Сложный пример с Python ORM

from sqlalchemy import union

# Получить всех активных и неактивных пользователей
active_users = session.query(User.id, User.name).filter(User.is_active == True)
inactive_users = session.query(User.id, User.name).filter(User.is_active == False)

# UNION для объединения
all_users = session.query(active_users.union(inactive_users)).all()

# Или с UNION ALL
all_users_with_dupes = session.query(
    active_users.union_all(inactive_users)
).all()

Производительность

  • UNION медленнее, потому что базе данных нужно удалять дубликаты
  • UNION ALL быстрее, используй когда дубликаты невозможны или допустимы
  • ORDER BY замедляет запрос — применяется после объединения
  • LIMIT работает ко всему результату объединения
SELECT name FROM users
UNION
SELECT name FROM members
LIMIT 10;  -- Вернёт первые 10 уникальных имён

Частые ошибки

-- Ошибка: разные столбцы
SELECT id, name FROM users
UNION
SELECT email FROM admins;  -- ERROR!

-- Ошибка: ORDER BY в неправильном месте
SELECT id FROM users ORDER BY id
UNION
SELECT id FROM members;  -- ORDER BY должен быть в конце

-- Правильно
SELECT id FROM users
UNION
SELECT id FROM members
ORDER BY id;

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

  • Используй UNION ALL когда знаешь, что дубликатов нет — это быстрее
  • Явно указывай столбцы, не используй SELECT *
  • Помни о типах данных — неявное преобразование может дать неожиданный результат
  • Для больших таблиц предпочитай JOIN, если можно — это обычно быстрее
  • Используй UNION для комбинирования результатов разных источников

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

Как работает UNION? | PrepBro