Модульні уроки (1/4)
JOIN на трьох або більше таблицях
У модулі 3 ви з’єднали два столи. У реальному світі дані майже
завжди розкидані по трьох або більше таблицях, пов’язаних зовнішніми ключами: to
дайте відповідь на ділове запитання, щоб пройти ланцюжок відносин.
Це саме те, що робить багатотабличний JOIN.
Починаючи з цього модуля, ми використовуватимемо набір даних ecommerce (клієнти,
категорії, товари, замовлення, позиції замовлення, відгуки). Ви можете досліджувати його з
Playground, вибравши 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. Емпіричне правило: не додавайте таблиці
ви не використовуєте — вони шкодять продуктивності та читабельності.
Спробуйте самі
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 спроб
Повторна вправа
3 найпопулярніші клієнти на загальну суму (кількість * ціна за одиницю) в одному порядку. Потрібна колонка: електронна пошта та всього. Ордина за загальне зменшення, обмеження 3.
Показати підказку
Не обслуговуйте продукти JOIN: quantity та unit_price sono già in order_items.
Рішення доступне після 3 спроб