Aufgabe 01 - Wiederholung Queries mit Northwind
Aufgabe 01 - Wiederholung Queries mit Northwind
Abschnitt betitelt „Aufgabe 01 - Wiederholung Queries mit Northwind“- Northwind-Datenbank im bestehenden Docker-Setup (PostgreSQL + pgAdmin) importieren
- JOINS über mehrere Tabellen
- Subqueries (IN, NOT EXISTS, korreliert)
- Aggregatsfunktionen mit GROUP BY und HAVING
Voraussetzungen & Setup
Abschnitt betitelt „Voraussetzungen & Setup“Operator: Konstruieren
- Stellen Sie sicher, dass Sie eine lauffähige PostgreSQL Umgebung haben.
- Legen Sie die Datei
northwind.sqlin Ihrem Host unter~/rdbms/northwind/ab. - Erstellen Sie eine Datenbank
northwindund importieren Sie das Schema + Daten:
# DB anlegendocker exec -i postgres psql -U pgadmin -c "CREATE DATABASE northwind;"
# SQL in den Container kopieren (Alternative: per pgAdmin importieren)docker cp ~/rdbms/northwind/northwind.sql postgres:/tmp/northwind.sql
# Import durchführendocker exec -i postgres psql -U pgadmin -d northwind -f /tmp/northwind.sqlSetzen Sie sich mit diesen Befehlen auseinander und erklären Sie kurz, was hier passiert.
Hinweise
- Prüfen Sie die Tabellenliste in
psqlmit\c northwindund\dt.- Häufige Tabellennamen:
customers,orders,order_details,products,categories,suppliers,employees,shippers.- Falls Ihre SQL-Datei abweichende Bezeichner (z.B. Großbuchstaben oder Leerzeichen) verwendet, passen Sie die Anführungszeichen entsprechend an.
Übungen
Abschnitt betitelt „Übungen“Übung 1 - Kunden & Bestellungen (INNER JOIN)
Abschnitt betitelt „Übung 1 - Kunden & Bestellungen (INNER JOIN)“Operator: Anwenden
Listen Sie die letzten 10 Bestellungen mit order_id, order_date, company_name des Kunden und dem Namen des betreuenden Mitarbeiters (employees.first_name, last_name) auf. Sortieren Sie nach order_date absteigend.
Übung 2 - Bestellzeilen mit Produktinfos (Mehrfach-JOIN)
Abschnitt betitelt „Übung 2 - Bestellzeilen mit Produktinfos (Mehrfach-JOIN)“Operator: Konstruieren
Geben Sie für eine konkrete Bestellung (z.B. order_id = 10248) die Positionen mit product_name, order_details.unit_price, quantity, discount und dem Zeilenwert line_total = unit_price * quantity * (1 - discount) aus.
Übung 3 - Umsatz je Kategorie (GROUP BY)
Abschnitt betitelt „Übung 3 - Umsatz je Kategorie (GROUP BY)“Operator: Analysieren
Berechnen Sie den Gesamtumsatz pro Produktkategorie (über alle Jahre). Zeigen Sie category_name und revenue_sum an und sortieren Sie absteigend.
Übung 4 - HAVING: Kategorien mit Mindestumsatz
Abschnitt betitelt „Übung 4 - HAVING: Kategorien mit Mindestumsatz“Operator: Bewerten
Erweitern Sie Übung 3 um eine Mindestschwelle, z.B. revenue_sum > 100000. Zeigen Sie nur Kategorien oberhalb der Schwelle. Begründen Sie kurz, warum die Bedingung in HAVING (und nicht in WHERE) gehört.
Übung 5 - Subquery (NOT EXISTS): Nie bestellte Produkte
Abschnitt betitelt „Übung 5 - Subquery (NOT EXISTS): Nie bestellte Produkte“Operator: Erklären
Finden Sie alle Produkte, die nie in order_details vorkommen. Geben Sie product_id, product_name, supplier_id aus. Nutzen Sie NOT EXISTS (oder alternativ LEFT JOIN … WHERE… IS NULL). Diskutieren Sie kurz die Vor- und Nachteile der beiden Varianten.
Übung 6 - Korreliert: Erster Bestellzeitpunkt je Kunde
Abschnitt betitelt „Übung 6 - Korreliert: Erster Bestellzeitpunkt je Kunde“Operator: Analysieren
Erklären Sie kurz den Begriff der korrelierten Subquery im Vergleich zu regulären Subqueries.
Ermitteln Sie dann für jeden Kunden das Datum der ersten Bestellung. Verwenden Sie eine korrelierte Subquery (z.B. order_date = (SELECT MIN(order_date) FROM orders o2 WHERE o2.customer_id = o.customer_id)). Geben Sie customer_id, company_name, first_order_date aus und sortieren Sie nach first_order_date.
Übung 7 - Top-Kunden 1997 (JOIN + Aggregat + HAVING)
Abschnitt betitelt „Übung 7 - Top-Kunden 1997 (JOIN + Aggregat + HAVING)“Operator: Bewerten
Ermitteln Sie die Top 5 Kunden nach Umsatz im Jahr 1997. Geben Sie company_name und revenue_1997 aus. Nutzen Sie EXTRACT(YEAR FROM order_date) = 1997 (oder zwischen 1997-01-01 und 1997-12-31). Arbeiten Sie mit GROUP BY und HAVING und begründen Sie Ihre Wahl der Filtermethode.
Übung 8 - “Best Seller pro Kategorie” (Subquery ohne Fensterfunktionen)
Abschnitt betitelt „Übung 8 - “Best Seller pro Kategorie” (Subquery ohne Fensterfunktionen)“Operator: Konstruieren
Bestimmen Sie pro Kategorie das umsatzstärkste Produkt. Verwenden Sie eine Subquery, die je Kategorie den Maximalumsatz bestimmt, und wählen Sie anschließend das/die Produkt(e), deren Umsatz diesem Maximum entspricht. Zeigen Sie category_name, product_name, product_revenue an.
Hinweis: Lösen Sie ohne Fensterfunktionen (reine Subqueries oder CTEs).
Bonus (optional)
Abschnitt betitelt „Bonus (optional)“Operator: Argumentieren
- Vergleichen Sie NOT EXISTS vs. LEFT JOIN IS NULL bzgl. Lesbarkeit und Optimierung.
- Diskutieren Sie, wie sich Rabatte (
discount) auf Analysen auswirken und wie Sie Brutto- vs. Netto-Umsatz definieren würden.
- Dokumentation mit:
- SQL-Befehlen
- Erläuterungen zu den Ergebnissen und Überlegungen
HTL Villach, 2025-2026,
https://www.htl-villach.at