Zum Inhalt springen

Aufgabe 01 - Wiederholung Queries mit Northwind

Zu Zen-Modus wechseln
  • Northwind-Datenbank im bestehenden Docker-Setup (PostgreSQL + pgAdmin) importieren
  • JOINS über mehrere Tabellen
  • Subqueries (IN, NOT EXISTS, korreliert)
  • Aggregatsfunktionen mit GROUP BY und HAVING

Operator: Konstruieren

  1. Stellen Sie sicher, dass Sie eine lauffähige PostgreSQL Umgebung haben.
  2. Legen Sie die Datei northwind.sql in Ihrem Host unter ~/rdbms/northwind/ ab.
  3. Erstellen Sie eine Datenbank northwind und importieren Sie das Schema + Daten:
Terminal-Fenster
# DB anlegen
docker 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ühren
docker exec -i postgres psql -U pgadmin -d northwind -f /tmp/northwind.sql

Setzen Sie sich mit diesen Befehlen auseinander und erklären Sie kurz, was hier passiert.

Hinweise

  • Prüfen Sie die Tabellenliste in psql mit \c northwind und \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.

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.


Operator: Analysieren

Berechnen Sie den Gesamtumsatz pro Produktkategorie (über alle Jahre). Zeigen Sie category_name und revenue_sum an und sortieren Sie absteigend.


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).


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