Перейти к основному содержимому
Модуль 5 · Урок 4 из 420/57 в курсе~12 min
Уроки модуля (4/4)

СОЮЗ, ПЕРЕСЕКРЕТ, ИСКЛЮЧАЯ (и ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ)

До сих пор вы объединили данные горизонтально: JOIN присоединяет столбцы. из связанных строк. SQL также предлагает другое семейство операторов, объединяет данные вертикально, обрабатывая результаты двух SELECT как устанавливает: UNION, INTERSECT, EXCEPT. Мы также вернемся к 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 сохраняет строки первого, которых нет во втором (набор «разница»).

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Загрузка…

Получите все электронные письма клиентов, которые могут быть отправлены по электронной почте OPPURE recensito qualcosa (без дубликатов). Уна Колонна: электронная почта. Ордина на эл.

Загрузка редактора…
Показать подсказку

UNION между двумя SELECT, возвращающими один и тот же столбец электронной почты. ORDER BY идет в конце окончательного результата.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m5.l4.e2
Попыток: 0Загрузка…

Найдите электронное письмо клиентов, которое может быть обычным, но не более того, если вы получите нулевой отзыв. США, КРОМЕ. Уна Колонна: электронная почта. Ордина на эл.

Загрузка редактора…
Показать подсказку

EXCEPT сохраняет только строки из левого SELECT, которых нет в правом.

Решение доступно после 3 попыток