Уроки модуля (1/4)
ОБЪЕДИНЯЙТЕСЬ на трех или более таблицах
В модуле 3 вы объединили две таблицы. В реальном мире данные почти
всегда разбросаны по трем или более таблицам, связанным внешними ключами:
ответив на деловой вопрос, вам предстоит пройти всю цепочку взаимоотношений.
Именно это и делает многотабличная таблица JOIN.
Начиная с этого модуля, мы будем использовать набор данных ecommerce (клиенты,
категории, товары, заказы, позиции заказа, отзывы). Вы можете изучить его из
Детская площадка, выбрав ecommerce из набора данных
сборщик.
Синтаксис: цепочка соединений JOIN.
SELECT colonne
FROM tabella_a
JOIN tabella_b ON tabella_a.x = tabella_b.y
JOIN tabella_c ON tabella_b.z = tabella_c.w
[JOIN tabella_d ON …]
…;Каждый JOIN добавляет «звено» в цепочку: движок занимает промежуточное
результат предыдущих соединений JOIN и присоединяет к нему следующую таблицу.
-- Per ogni riga d'ordine: cliente, prodotto e quantità.
SELECT c.email,
p.name AS prodotto,
oi.quantity
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.id
JOIN order_items AS oi ON oi.order_id = o.id
JOIN products AS p ON oi.product_id = p.id;Три JOIN, четыре таблицы. Результат имеет одну строку на order_items — каждый
продукт в каждом заказе — дополнен адресом электронной почты клиента и названием продукта.
Логический порядок
Движок объединяет таблицы слева направо. Условие JOIN может
обратитесь к любой таблице, уже представленной выше. Для удобства чтения:
- первой поставьте "основную таблицу" вопроса (здесь
orders); - добавьте остальные в том порядке, в котором вы их посещаете, следуя инструкциям отношения.
Агрегаты по цепочкам JOIN
Несколько JOIN в сочетании с GROUP BY для создания отчетов:
-- Spesa totale per cliente (solo ordini consegnati):
SELECT c.email,
SUM(oi.quantity * oi.unit_price) AS total
FROM customers AS c
JOIN orders AS o ON o.customer_id = c.id
JOIN order_items AS oi ON oi.order_id = o.id
WHERE o.status = 'delivered'
GROUP BY c.email
ORDER BY total DESC;Здесь не нужен JOIN products: всё, что вам нужно (quantity,
unit_price) уже находится в order_items. Эмпирическое правило: не добавляйте таблицы.
вы не используете — они ухудшают производительность и читабельность.
Попробуйте сами
Для каждого отправления заказа в Риге (статус = «доставлено»), отправляйте электронное письмо клиенту, имя продукта и количество. Тре колонне. Ordina per id ordine crescente e id prodotto crescente.
Показать подсказку
Три соединения: заказы→клиенты по идентификатору клиента, заказы→order_items по идентификатору заказа, заказ_элементы→продукты по идентификатору продукта.
Решение доступно после 3 попыток
Обзор упражнения
3 крупнейших клиента по общей цене (количество * цена за единицу) являются одними из наиболее популярных. Должная колонка: адрес электронной почты и общая сумма. Ордина по общему убыванию, ограничение до 3.
Показать подсказку
Не обслуживайте продукты JOIN: количество и цена за единицу, а также в order_items.
Решение доступно после 3 попыток