Lekcje modułu (1/4)
JOINy na trzech lub więcej tabelach
W module 3 połączyłeś dwa stoły. W prawdziwym świecie dane są prawie
zawsze rozproszone w trzech lub więcej tabelach połączonych kluczami obcymi: do
odpowiedzieć na pytanie biznesowe, musisz przejść przez łańcuch relacji.
Dokładnie to robi wielotabelowy JOIN.
Od tego modułu będziemy używać zestawu danych ecommerce (klienci,
kategorie, produkty, zamówienia, pozycje zamówienia, recenzje). Możesz to zbadać z
Playground, wybierając ecommerce ze zbioru danych
zbieracz.
Składnia: łańcuch złączeń
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 …]
…;Każdy JOIN dodaje „ogniwo” do łańcucha: silnik wykorzystuje półprodukt
wynik poprzednich operacji JOIN i dołącza do niego następną tabelę.
-- 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;Trzy JOIN, cztery tabele. Wynik ma jeden wiersz na każdy order_items — każdy
produkt w każdym zamówieniu — wzbogacony o adres e-mail klienta i nazwę produktu.
Porządek logiczny
Silnik łączy tabele od lewej do prawej. Warunek JOIN może
odwołaj się do dowolnej tabeli wprowadzonej powyżej. Dla czytelności:
- na pierwszym miejscu umieść „tabelę główną” pytania (tutaj
orders); - dodaj pozostałe w kolejności, w jakiej je odwiedzasz, postępując zgodnie z relacje.
Agreguje w łańcuchach JOIN
Wiele JOIN łączy się z GROUP BY, tworząc raporty:
-- 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;Nie potrzebujesz tutaj JOIN products: wszystko, czego potrzebujesz (quantity,
unit_price) jest już w order_items. Ogólna zasada: nie dodawaj tabel
nie używasz — pogarszają wydajność i czytelność.
Spróbuj sam
Per każdy riga d'ordine degli ordini consegnati (status = „dostarczono”), większość e-maili do klientów, nazwy produktów i ilości. Tre kolonia. Ordina per id ordine crescente e id prodotto crescente.
Pokaż wskazówkę
Trzy JOINy: zamówienia → klienci na identyfikatorze_klienta, zamówienia → elementy_zamówienia na identyfikatorze zamówienia, elementy zamówienia → produkty na identyfikatorze produktu.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
3 najlepszych klientów na całkowitą kwotę (ilość * cena_jednostkowa) sui soli ordini consegnati. Due colonne: e-mail i łącznie. Ordina per total decrecente, limit a 3.
Pokaż wskazówkę
Nie podawaj produktów DOŁĄCZ: ilość i cena jednostkowa w zamówieniu_przedmiotów.
Rozwiązanie dostępne po 3 próbach