Lektionen des Moduls (1/4)
JOINs über drei oder mehr Tabellen
In Modul 3 haben Sie zwei Tische verbunden. In der realen Welt sind die Daten fast identisch
immer über drei oder mehr Tabellen verstreut, die durch Fremdschlüssel verknüpft sind: bis
Um eine geschäftliche Frage zu beantworten, müssen Sie die Beziehungskette durchlaufen.
Genau das macht ein JOIN mit mehreren Tabellen.
Ab diesem Modul verwenden wir den Datensatz ecommerce (Kunden,
Kategorien, Produkte, Bestellungen, Bestellpositionen, Bewertungen). Sie können es erkunden
den Playground, indem Sie ecommerce aus dem Datensatz auswählen
Pflücker.
Die Syntax: eine Kette von JOINs
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 …]
…;Jeder JOIN fügt der Kette ein „Glied“ hinzu: Die Engine übernimmt das Zwischenprodukt
Ergebnis der vorherigen JOINs und hängt die nächste Tabelle daran an.
-- 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;Drei JOINs, vier Tabellen. Das Ergebnis hat eine Zeile pro order_items – jeweils
Produkt in jeder Bestellung – angereichert mit Kunden-E-Mail und Produktname.
Die logische Reihenfolge
Die Engine verknüpft Tabellen von links nach rechts. Eine JOIN-Bedingung kann
Verweisen Sie auf eine der oben bereits vorgestellten Tabellen. Zur besseren Lesbarkeit:
- Stellen Sie die „Haupttabelle“ der Frage an die erste Stelle (hier
orders); - Fügen Sie die anderen in der Reihenfolge hinzu, in der Sie sie besuchen, indem Sie den folgen Beziehungen.
Aggregate über JOIN-Ketten
Mehrere JOINs werden mit GROUP BY kombiniert, um Berichte zu erstellen:
-- 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;Sie benötigen hier nicht JOIN products: alles, was Sie brauchen (quantity,
unit_price) ist bereits in order_items. Faustregel: Fügen Sie keine Tabellen hinzu
Sie verwenden sie nicht – sie beeinträchtigen die Leistung und Lesbarkeit.
Probieren Sie es selbst aus
Für die Dauer der Bestellung (Status = „geliefert“) senden Sie bitte die E-Mail-Adresse des Kunden, den Namen des Produkts und die Menge. Drei Säulen. Ordina per id ordine crescente und id prodotto crescente.
Hinweis anzeigen
Drei JOINs: Aufträge → Kunden auf Kunden-ID, Aufträge → Bestellartikel auf Bestell-ID, Bestellartikel → Produkte auf Produkt-ID.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Die 3 besten Kunden pro Gesamtbestellung (Menge * Stückpreis) auf eigene Faust. Doppelte Spalte: E-Mail und Gesamtsumme. Ordina per total decrescente, limita a 3.
Hinweis anzeigen
Es werden keine JOIN-Produkte bereitgestellt: Menge und Einheitspreis werden in order_items eingegeben.
Lösung nach 3 Versuchen verfügbar