Модульні уроки (4/4)
UNION, INTERSECT, EXCEPT (і CROSS JOIN)
Наразі ви об’єднали дані горизонтально: JOIN додає стовпці
із пов’язаних рядків. SQL також пропонує інше сімейство операторів
поєднує дані вертикально, розглядаючи результати двох SELECT як
набори: UNION, INTERSECT, EXCEPT. Ми також повертаємось до CROSS JOIN, the
декартовий добуток.
CROSS JOIN: кожен рядок з кожним рядом
CROSS JOIN не має ON: він створює усі можливі комбінації
рядки між двома таблицями (декартів добуток). Якщо A має n рядків і B
має m рядків, результат має n × m.
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 клієнтів × 16 товарів = 192 рядки. Він рідко використовується для реальних даних (це дорого!), але це корисно для:
- створення комбінацій «всі проти всіх» (наприклад, матриця сумісності);
- поєднання таблиці з невеликою таблицею констант / параметрів.
СОЮЗ і СОЮЗ ВСЕ
UNION додає результати двох SELECT з однаковим номером і
тип колонок:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';правила:
- два
SELECTповинні мати однакову кількість стовпців із сумісними види; UNION(безALL) видаляє дублікати — ефективно виконуєDISTINCTпро кінцевий результат;UNION ALLтакож зберігає дублікати та працює набагато швидше, оскільки уникає сортування/хешування для дедуплікації.
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM customers c JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.email
FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT і EXCEPT
INTERSECT зберігає лише рядки, присутні в обох результатах; EXCEPT
зберігає рядки першого, яких немає у другому (набір
«різниця»).
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;
-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT та EXCEPT також видаляють дублікати за умовчанням; в
Варіанти INTERSECT ALL / EXCEPT ALL ні.
Спробуйте самі
Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Una colonna: електронна пошта. Ордина по електронній пошті.
Показати підказку
UNION між двома SELECT, які повертають той самий стовпець електронної пошти. ORDER BY йде в кінці, на кінцевий результат.
Рішення доступне після 3 спроб
Повторна вправа
Trova le email dei clienti che hanno ordinato ma non hanno mai recensito nulla. США КРІМ. Una colonna: електронна пошта. Ордина по електронній пошті.
Показати підказку
EXCEPT зберігає лише ті рядки з лівого SELECT, яких немає в правому.
Рішення доступне після 3 спроб