Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 1 z 417/57 w kursie~12 min
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ń

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 …]
…;

Każdy JOIN dodaje „ogniwo” do łańcucha: silnik wykorzystuje półprodukt wynik poprzednich operacji JOIN i dołącza do niego następną tabelę.

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;

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:

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;

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

Ćwiczenie#sql.m5.l1.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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

Ćwiczenie#sql.m5.l1.e2
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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