Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работает 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
- Одинаковое количество столбцов в SELECT запросах
- Совместимые типы данных в соответствующих позициях
- Один порядок столбцов во всех запросах
# Корректный запрос
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, а также когда их использовать.