Aufgabe 01 Plus - Sonderübungsblatt Subqueries
Aufgabe 01 Plus - Sonderübungen Subqueries
Abschnitt betitelt „Aufgabe 01 Plus - Sonderübungen Subqueries“Worum geht es?
Abschnitt betitelt „Worum geht es?“In dieser Zusatzübung werden Subqueries an der Northwind-Datenbank vertieft: einfache und korrelierte Subqueries, Vergleiche gegen Durchschnitts- und Maximalwerte sowie Anti-Joins mit NOT EXISTS (siehe Kapitel 1 - Komplexe Abfragen). Der Expertenteil bringt mehrstufige Anti-Joins und einen Chef-Mitarbeiter-Vergleich.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Northwind in PostgreSQL importiert (wie in Aufgabe 01).
- Nützliche Tabellen:
orders,order_details,customers,employees,products,categories,shippers.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie setzen einfache und korrelierte Subqueries sicher ein.
- Sie vergleichen Werte gegen Durchschnitte und Maxima per Subquery.
- Sie verstehen Anti-Joins mit
NOT EXISTS. - Sie lösen mehrstufige Subquery-Ketten über mehrere Tabellen.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: einfache Subqueries anwenden (Teil A).
- Reorganisation und Transfer: Durchschnittsvergleiche und Zuordnungen lösen (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: mehrstufige Anti-Joins und Vergleiche entwickeln (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Netto-Wert durchgehend: unit_price * quantity * (1 - discount).
Teil A - Warm-up
Abschnitt betitelt „Teil A - Warm-up“- Durchschnittlicher Bestellwert 1998: ein Wert. Positionen je Bestellung in einer Subquery summieren und darüber den Durchschnitt bilden. Spalte:
avg_order_total_1998. - Größte Bestellung 1998: Subquery mit
SUM(...)jeorder_id, dann die Zeile(n) mit dem Maximum per Subquery aufMAX(total)(keinORDER BY ... LIMIT 1). Spalten:order_id, order_date, company_name, order_total. - Land mit den meisten Kunden: je
countryzählen, mitMAX(count_per_country)vergleichen. Spalten:country, customers_count. - Zusteller ohne Zustellung:
NOT EXISTSgegenorders(ship_via = sh.shipper_id). Spalten:shipper_id, company_name. - Nie per „Speedy Express” beliefert:
NOT EXISTSgegenordersmit Bedingung auf diesen Shipper. Spalten:customer_id, company_name. - Bestellungen Londoner Kunden 1997: Kunden per
IN(city = 'London'), dannordersnach Jahr filtern. Spalten:order_id, order_date, customer_id.
Teil B - Vergleich mit Durchschnittswerten
Abschnitt betitelt „Teil B - Vergleich mit Durchschnittswerten“- Überdurchschnittlich verkaufte Produkte:
SUM(quantity)je Produkt gegen den Durchschnitt aller Produkte. Spalten:product_id, product_name, units_sold, avg_units_all. - Teurer als der Kategorie-Durchschnitt: korreliert
products.unit_pricegegenAVG(unit_price)je Kategorie. Spalten:category_name, product_name, unit_price, category_avg_price. - Kategorien über dem Durchschnitts-Bestellwert: Bestellwert je Kategorie gegen den Durchschnitt aller Kategorien. Spalten:
category_name, category_revenue, avg_revenue_all. - Positionen unter 10 % der Produkt-Durchschnittsmenge:
od.quantitygegen0.1 * (SELECT AVG(quantity) FROM order_details od2 WHERE od2.product_id = od.product_id). Spalten:order_id, product_id, quantity, product_avg_qty.
Teil C - Personen und Zuordnungen
Abschnitt betitelt „Teil C - Personen und Zuordnungen“- Bester Kunde (höchster Gesamtumsatz): Umsatz je Kunde, Top-Wert per Subquery auf
MAX(total_per_customer). Spalten:customer_id, company_name, address, city, country, total_revenue. - Mitarbeiter mit den wenigsten betreuten Kunden: distinct customers je Mitarbeiter (
orders.employee_id), Minimum per Subquery. Spalten:employee_id, first_name, last_name, distinct_customers. - Lieferung in die Wohnstadt des Mitarbeiters:
orders.ship_citygegenemployees.citydesorders.employee_id, Mitarbeiterstadt per Subquery. Spalten:order_id, order_date, employee, ship_city.
Teil D - Expertenteil
Abschnitt betitelt „Teil D - Expertenteil“- Nie „Seafood” bestellt:
NOT EXISTSüber die Ketteorders → order_details → products → categories(Filtercategory_name = 'Seafood'). Spalten:customer_id, company_name. - USA ja, Kanada nein: Produkte, die Kunden aus den USA bestellt haben, aber keine aus Kanada (
IN (...USA...) AND NOT IN (...Canada...)auf Produktebene). Spalten:product_id, product_name. - Fleißiger als der Chef: Chefbeziehung über
employees.reports_to. Bestellungen je Mitarbeiter zählen und je Paar (Mitarbeiter vs. Chef) mit korrelierter Subquery vergleichen. Spalten:employee, boss, emp_orders, boss_orders.
Selbstkontrolle
Abschnitt betitelt „Selbstkontrolle“- Wird der Netto-Wert konsequent als
unit_price * quantity * (1 - discount)berechnet? - Stehen Zeitfilter an der richtigen Stelle (in der Subquery bei
NOT EXISTS)? - Wird bei „nie gekauft/zugestellt” das Muster
NOT EXISTSgenutzt? - Sind Durchschnittsvergleiche korreliert, wo sie sich auf die Außenzeile beziehen?
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Wann ist eine Subquery korreliert?
- Warum löst man „größte Bestellung” mit
MAX(...)stattORDER BY ... LIMIT 1, wenn Gleichstände möglich sein sollen? - Wie prüft man „nie X bestellt” über mehrere Tabellen hinweg?
- Worin unterscheiden sich
NOT INundNOT EXISTSbeim Umgang mitNULL? - Wie vergleicht man einen Mitarbeiter mit seinem Chef in einer Abfrage?
- Eine SQL-Datei
sonderuebung_subqueries.sqlmit allen Lösungen. - Eine kurze Textdatei mit 1–2 Sätzen je Aufgabe: gewähltes Muster (
IN,EXISTS, korreliert) und Begründung.
HTL Villach, 2025-2026,
https://www.htl-villach.at