Перейти до основного вмісту
Модуль 5 · Урок 4 із 420/57 у курсі~12 min
Модульні уроки (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.

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 клієнтів × 16 товарів = 192 рядки. Він рідко використовується для реальних даних (це дорого!), але це корисно для:

  • створення комбінацій «всі проти всіх» (наприклад, матриця сумісності);
  • поєднання таблиці з невеликою таблицею констант / параметрів.

СОЮЗ і СОЮЗ ВСЕ

UNION додає результати двох SELECT з однаковим номером і тип колонок:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

правила:

  • два SELECT повинні мати однакову кількість стовпців із сумісними види;
  • UNION (без ALL) видаляє дублікати — ефективно виконує DISTINCT про кінцевий результат;
  • UNION ALL також зберігає дублікати та працює набагато швидше, оскільки уникає сортування/хешування для дедуплікації.
SQL
-- 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 зберігає рядки першого, яких немає у другому (набір «різниця»).

SQL
-- 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 ні.

Спробуйте самі

вправи#sql.m5.l4.e1
Спроби: 0Завантаження…

Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Una colonna: електронна пошта. Ордина по електронній пошті.

Завантаження редактора…
Показати підказку

UNION між двома SELECT, які повертають той самий стовпець електронної пошти. ORDER BY йде в кінці, на кінцевий результат.

Рішення доступне після 3 спроб

Повторна вправа

вправи#sql.m5.l4.e2
Спроби: 0Завантаження…

Trova le email dei clienti che hanno ordinato ma non hanno mai recensito nulla. США КРІМ. Una colonna: електронна пошта. Ордина по електронній пошті.

Завантаження редактора…
Показати підказку

EXCEPT зберігає лише ті рядки з лівого SELECT, яких немає в правому.

Рішення доступне після 3 спроб