Zum Inhalt springen

Aufgabe 01 - Wiederholung Queries mit Northwind

Zu Zen-Modus wechseln

In dieser Übung wird die aus der 3. Klasse bekannte SQL-Basis an der Northwind-Datenbank aufgefrischt: Joins über mehrere Tabellen, Aggregation mit GROUP BY und HAVING sowie Subqueries (siehe Kapitel 1 - Komplexe Abfragen). Im Expertenteil wird der Bestseller je Kategorie ganz ohne Fensterfunktionen ermittelt.

  • Ein lauffähiges PostgreSQL-Docker-Setup (aus der 3. Klasse) mit pgAdmin.
  • Die Datei northwind.sql.
  • Wiederholung: Joins, Aggregation, Subqueries (Kapitel der 3. Klasse).
  • Sie importieren eine bestehende Datenbank in einen laufenden Container.
  • Sie verknüpfen mehrere Tabellen und aggregieren mit GROUP BY/HAVING.
  • Sie setzen NOT EXISTS und korrelierte Subqueries ein.
  • Sie lösen ein „Bestes je Gruppe”-Problem ohne Fensterfunktionen und definieren Brutto- und Netto-Umsatz.
  • Reproduktion: die Datenbank importieren und einfache Joins anwenden (Teil A).
  • Reorganisation und Transfer: aggregieren und filtern (Teil B).
  • Reflexion, Problemlösung und Urteilsbildung: Subqueries und ein Bestseller-Problem lösen und begründen (Teile C und D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

Terminal-Fenster
docker exec -i postgres psql -U pgadmin -c "CREATE DATABASE northwind;"
docker cp ~/rdbms/northwind/northwind.sql postgres:/tmp/northwind.sql
docker exec -i postgres psql -U pgadmin -d northwind -f /tmp/northwind.sql

Die Tabellenliste mit \c northwind und \dt prüfen. Häufige Tabellen: customers, orders, order_details, products, categories, suppliers, employees, shippers. In zwei Sätzen erklären, was die drei Befehle tun.

Netto-Zeilenwert durchgehend: unit_price * quantity * (1 - discount).

  1. INNER JOIN: die letzten 10 Bestellungen mit order_id, order_date, Firmenname des Kunden und Name des betreuenden Mitarbeiters, nach order_date absteigend.
  2. Mehrfach-JOIN: für order_id = 10248 die Positionen mit product_name, unit_price, quantity, discount und dem Zeilenwert line_total.
  1. GROUP BY: Gesamtumsatz je Produktkategorie (category_name, revenue_sum), absteigend.
  2. HAVING: dieselbe Auswertung, aber nur Kategorien mit revenue_sum > 100000. Begründen, warum die Bedingung in HAVING und nicht in WHERE gehört.
  1. NOT EXISTS: alle Produkte, die nie in order_details vorkommen (product_id, product_name, supplier_id).
  2. Korreliert: je Kunde das Datum der ersten Bestellung mit einer korrelierten Subquery (order_date = (SELECT MIN(...) ...)). Zusätzlich den Begriff korrelierte Subquery in zwei Sätzen erklären.

Teil D - Expertenteil: Bestseller je Kategorie und Brutto/Netto

Abschnitt betitelt „Teil D - Expertenteil: Bestseller je Kategorie und Brutto/Netto“
  1. Top-5-Kunden 1997: die fünf umsatzstärksten Kunden im Jahr 1997 (company_name, revenue_1997) mit GROUP BY und HAVING. Die Wahl der Jahresfilter-Methode (EXTRACT(YEAR ...) oder Datumsbereich) begründen.
  2. Bestseller je Kategorie ohne Fensterfunktionen: je Kategorie das umsatzstärkste Produkt. Mit einer Subquery (oder CTE) je Kategorie den Maximalumsatz bestimmen und dann die Produkte auswählen, deren Umsatz diesem Maximum entspricht (category_name, product_name, product_revenue). Beschreiben, was bei einem Gleichstand (zwei Produkte mit demselben Maximum) passiert.
  3. NOT EXISTS vs. LEFT JOIN: die Abfrage aus Teil C.1 zusätzlich als LEFT JOIN ... WHERE ... IS NULL schreiben und in drei bis vier Sätzen Lesbarkeit und Verhalten der beiden Varianten vergleichen.
  4. Brutto vs. Netto: definieren, wie sich discount auf Analysen auswirkt, und je eine Kennzahl für Brutto- und Netto-Umsatz angeben.
  1. Was tun die drei Setup-Befehle beim Import?
  2. Warum gehört eine Bedingung auf ein Aggregat in HAVING?
  3. Worin unterscheidet sich eine korrelierte von einer nicht korrelierten Subquery?
  4. Wie ermittelt man das Beste je Gruppe ohne Fensterfunktionen?
  5. Worin unterscheiden sich Brutto- und Netto-Umsatz in Northwind?
  • Eine SQL-Datei mit allen Abfragen und kurzen Erläuterungen zu den Ergebnissen und Begründungen aus Teil D.

HTL Villach, 2025-2026,
https://www.htl-villach.at