Задачи SQL Справочник UNION

UNION, INTERSECT и EXCEPT

UNION, INTERSECT и EXCEPT собирают результаты двух запросов в один список, пересечение или разность.

UNION и UNION ALL

UNION объединяет результаты двух запросов в один список. Число колонок и их типы должны совпадать. Имена колонок берёт верхний запрос.

UNION убирает повторяющиеся строки, UNION ALL оставляет все.

SELECT name
FROM products
WHERE category_id = 4
UNION
SELECT name
FROM products
WHERE price < 800
ORDER BY name;
Категория «Дом» и товары дешевле 800; каждое имя — один раз
name
Война и мир
Кофеварка
Лампа
Подушка
Чайник

Подушка входит и в категорию «Дом», и в товары дешевле 800. UNION ALL выведет её дважды, UNION — один раз.

SELECT name
FROM products
WHERE category_id = 4
UNION ALL
SELECT name
FROM products
WHERE price < 800
ORDER BY name;
Подушка встречается дважды
name
Война и мир
Кофеварка
Лампа
Подушка
Подушка
Чайник

ORDER BY пишут один раз — в самом конце, ко всему объединённому результату.

INTERSECT

INTERSECT оставляет только те строки, которые есть в обоих запросах, и убирает повторы.

SELECT name
FROM products
WHERE category_id = 4
INTERSECT
SELECT name
FROM products
WHERE price < 800;
И в категории «Дом», и дешевле 800 — только подушка
name
Подушка

EXCEPT

EXCEPT оставляет строки первого запроса, которых нет во втором. Порядок запросов важен: это не симметричная операция.

SELECT name
FROM products
WHERE category_id = 4
EXCEPT
SELECT name
FROM products
WHERE price < 800
ORDER BY name;
Категория «Дом» без товаров дешевле 800
name
Кофеварка
Лампа
Чайник

Тот же смысл часто записывают через NOT EXISTS или LEFT JOIN … IS NULL. EXCEPT короче, когда сравнивают два готовых набора строк.

Дальше — оконные функции.