Эти операции позволяют комбинировать результаты нескольких запросов по разным правилам. Рассмотрим каждую из них подробно.
SELECT product_id FROM current_products
UNION
SELECT product_id FROM discontinued_products;
SELECT name FROM employees_east
UNION ALL
SELECT name FROM employees_west;
SELECT customer_id FROM premium_clients
INTERSECT
SELECT customer_id FROM active_orders;
SELECT DISTINCT p.customer_id
FROM premium_clients p
INNER JOIN active_orders a ON p.customer_id = a.customer_id;
SELECT employee_id FROM all_employees
MINUS
SELECT employee_id FROM managers;
SELECT a.employee_id
FROM all_employees a
LEFT JOIN managers m ON a.employee_id = m.employee_id
WHERE m.employee_id IS NULL;
Операция | Результат | Аналог теории множеств |
---|---|---|
UNION | Все уникальные строки из обоих запросов | A ∪ B |
INTERSECT | Только общие строки | A ∩ B |
MINUS/EXCEPT | Строки из A, которых нет в B | A \ B |
-- Клиенты, которые покупали и в 2022, и в 2023, но не в 2024
SELECT customer_id FROM sales_2022
INTERSECT
SELECT customer_id FROM sales_2023
EXCEPT
SELECT customer_id FROM sales_2024;
-- ОШИБКА: разное количество столбцов
SELECT id, name FROM table1
UNION
SELECT id FROM table2;
-- Возвращает 100 строк (с дубликатами)
SELECT name FROM tableA WHERE condition
UNION ALL
SELECT name FROM tableB WHERE condition;
-- Возвращает ≤100 строк (без дубликатов)
SELECT name FROM tableA WHERE condition
UNION
SELECT name FROM tableB WHERE condition;
-- Правильно:
SELECT col1 FROM table1
UNION
SELECT col1 FROM table2
ORDER BY col1;
-- Неправильно (в некоторых СУБД вызовет ошибку):
SELECT col1 FROM table1 ORDER BY col1
UNION
SELECT col1 FROM table2;
Ключевые операции работы с множествами в SQL:
Оптимальные практики:
Эти операции особенно полезны для:
✔ Консолидации данных из разных источников
✔ Сравнительного анализа наборов данных
✔ Реализации сложной бизнес-логики на уровне БД