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;
| 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;
| name |
|---|
| Подушка |
EXCEPT
EXCEPT оставляет строки первого запроса, которых нет во втором.
Порядок запросов важен: это не симметричная операция.
SELECT name
FROM products
WHERE category_id = 4
EXCEPT
SELECT name
FROM products
WHERE price < 800
ORDER BY name;
| name |
|---|
| Кофеварка |
| Лампа |
| Чайник |
Тот же смысл часто записывают через NOT EXISTS или LEFT JOIN … IS NULL.
EXCEPT короче, когда сравнивают два готовых набора строк.
Дальше — оконные функции.