Что такое команды UNION, MINUS и INTERSECT?sql-74

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

1. UNION — объединение результатов

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

SELECT product_id FROM current_products
UNION
SELECT product_id FROM discontinued_products;
  • Объединяет результаты двух и более запросов
  • Удаляет дубликаты (используйте UNION ALL для сохранения дубликатов)
  • Требует одинакового количества столбцов в выборках
  • Соответствующие столбцы должны иметь совместимые типы данных

Варианты:

  • UNION ALL: быстрее, так как не проверяет дубликаты
SELECT name FROM employees_east
UNION ALL
SELECT name FROM employees_west;

2. INTERSECT — пересечение результатов

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

SELECT customer_id FROM premium_clients
INTERSECT
SELECT customer_id FROM active_orders;
  • Возвращает только строки, присутствующие в обоих наборах результатов
  • Также удаляет дубликаты
  • Поддерживается не во всех СУБД (в MySQL используется JOIN или EXISTS как альтернатива)

Эмуляция в MySQL:

SELECT DISTINCT p.customer_id
FROM premium_clients p
INNER JOIN active_orders a ON p.customer_id = a.customer_id;

3. MINUS — разность результатов

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

SELECT employee_id FROM all_employees
MINUS
SELECT employee_id FROM managers;
  • Возвращает строки из первого запроса, отсутствующие во втором
  • В SQL Server называется EXCEPT
  • В MySQL требует эмуляции через LEFT JOIN

Эмуляция в MySQL:

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, которых нет в BA \ B

🛠️ Практическое применение

Пример комплексного использования:

-- Клиенты, которые покупали и в 2022, и в 2023, но не в 2024
SELECT customer_id FROM sales_2022
INTERSECT
SELECT customer_id FROM sales_2023
EXCEPT
SELECT customer_id FROM sales_2024;

Важные особенности:

  1. Сортировка — применяется только к конечному результату
  2. Имена столбцов — берутся из первого запроса
  3. Производительность — порядок операций влияет на скорость

⚠️ Распространенные ошибки

  1. Несовпадение количества или типов столбцов:
-- ОШИБКА: разное количество столбцов
SELECT id, name FROM table1
UNION
SELECT id FROM table2;
  1. Путаница между UNION и UNION ALL:
-- Возвращает 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;
  1. Использование ORDER BY в отдельных запросах вместо финального:
-- Правильно:
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:

  • UNION — объединение данных (аналог OR)
  • INTERSECT — пересечение данных (аналог AND)
  • MINUS/EXCEPT — вычитание данных (аналог AND NOT)

Оптимальные практики:

  1. Используйте UNION ALL вместо UNION, если дубликаты не критичны
  2. Для больших таблиц сначала фильтруйте данные, затем объединяйте
  3. Помните о различиях в синтаксисе между СУБД (особенно MINUS/EXCEPT)
  4. Комбинируйте операции для сложной фильтрации данных

Эти операции особенно полезны для: ✔ Консолидации данных из разных источников
✔ Сравнительного анализа наборов данных
✔ Реализации сложной бизнес-логики на уровне БД