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

ОБЪЕДИНЯЙТЕСЬ на трех или более таблицах

В модуле 3 вы объединили две таблицы. В реальном мире данные почти всегда разбросаны по трем или более таблицам, связанным внешними ключами: ответив на деловой вопрос, вам предстоит пройти всю цепочку взаимоотношений. Именно это и делает многотабличная таблица JOIN.

Начиная с этого модуля, мы будем использовать набор данных ecommerce (клиенты, категории, товары, заказы, позиции заказа, отзывы). Вы можете изучить его из Детская площадка, выбрав ecommerce из набора данных сборщик.

Синтаксис: цепочка соединений JOIN.

SQL
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 и присоединяет к нему следующую таблицу.

SQL
-- 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 для создания отчетов:

SQL
-- 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. Эмпирическое правило: не добавляйте таблицы. вы не используете — они ухудшают производительность и читабельность.

Попробуйте сами

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

Для каждого отправления заказа в Риге (статус = «доставлено»), отправляйте электронное письмо клиенту, имя продукта и количество. Тре колонне. Ordina per id ordine crescente e id prodotto crescente.

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

Три соединения: заказы→клиенты по идентификатору клиента, заказы→order_items по идентификатору заказа, заказ_элементы→продукты по идентификатору продукта.

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

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

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

3 крупнейших клиента по общей цене (количество * цена за единицу) являются одними из наиболее популярных. Должная колонка: адрес электронной почты и общая сумма. Ордина по общему убыванию, ограничение до 3.

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

Не обслуживайте продукты JOIN: количество и цена за единицу, а также в order_items.

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