Уроки модуля (4/4)
СОЮЗ, ПЕРЕСЕКРЕТ, ИСКЛЮЧАЯ (и ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ)
До сих пор вы объединили данные горизонтально: JOIN присоединяет столбцы.
из связанных строк. SQL также предлагает другое семейство операторов,
объединяет данные вертикально, обрабатывая результаты двух SELECT как
устанавливает: UNION, INTERSECT, EXCEPT. Мы также вернемся к 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
сохраняет строки первого, которых нет во втором (набор
«разница»).
-- 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 нет.
Попробуйте сами
Получите все электронные письма клиентов, которые могут быть отправлены по электронной почте OPPURE recensito qualcosa (без дубликатов). Уна Колонна: электронная почта. Ордина на эл.
Показать подсказку
UNION между двумя SELECT, возвращающими один и тот же столбец электронной почты. ORDER BY идет в конце окончательного результата.
Решение доступно после 3 попыток
Обзор упражнения
Найдите электронное письмо клиентов, которое может быть обычным, но не более того, если вы получите нулевой отзыв. США, КРОМЕ. Уна Колонна: электронная почта. Ордина на эл.
Показать подсказку
EXCEPT сохраняет только строки из левого SELECT, которых нет в правом.
Решение доступно после 3 попыток