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

JOIN на трьох або більше таблицях

У модулі 3 ви з’єднали два столи. У реальному світі дані майже завжди розкидані по трьох або більше таблицях, пов’язаних зовнішніми ключами: to дайте відповідь на ділове запитання, щоб пройти ланцюжок відносин. Це саме те, що робить багатотабличний JOIN.

Починаючи з цього модуля, ми використовуватимемо набір даних ecommerce (клієнти, категорії, товари, замовлення, позиції замовлення, відгуки). Ви можете досліджувати його з Playground, вибравши 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Завантаження…

Per ogni riga d'ordine degli ordini consegnati (status = "delivered"), mostra email del cliente, nome del dottotto e quantità. Три колони. Ordina per id ordine crescente e id prodotto crescente.

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

Три JOIN: orders→customers на customer_id, orders→order_items на order_id, order_items→products на product_id.

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

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

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

3 найпопулярніші клієнти на загальну суму (кількість * ціна за одиницю) в одному порядку. Потрібна колонка: електронна пошта та всього. Ордина за загальне зменшення, обмеження 3.

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

Не обслуговуйте продукти JOIN: quantity та unit_price sono già in order_items.

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