Aufgaben-Python/courses/sql/10_subqueries_und_mengenoperationen/README.md

56 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SQL 10: Subqueries & Mengenoperationen 🔍🔀
Willkommen zu **Modul 10 (Lehrpfad 3: Aggregationen, CTEs & Window Functions)**!
In diesem Modul lernst du, wie du komplexe Geschäftslogik mit verschachtelten Unterabfragen (Subqueries) und mengentheoretischen Operatoren elegant und performant löst.
---
## 🎯 Lernziele
1. **Skalare Subqueries**: Nutzen von Unterabfragen in `SELECT` und `WHERE`, die genau einen Einzelwert (z.B. Durchschnitt) zurückliefern.
2. **Korrelierte Subqueries & EXISTS**: Zeilenweise Verknüpfung äußerer Tabellen mit Subqueries (`EXISTS` / `NOT EXISTS`) für performante Filterung.
3. **Mengenoperationen**: Vereinigen von Datensätzen mit `UNION` (Deduplizierung) und `UNION ALL` (maximale Performance).
4. **Schnitt- & Differenzmengen**: Finden von gemeinsamen Kunden (`INTERSECT`) und Ausschlussmengen (`EXCEPT`).
---
## 💡 Kernkonzepte
### 1. `IN` vs. `EXISTS`
- `IN`: Evaluiert die gesamte Subquery zu einer Wertemenge. Bei großen Datenmengen oder `NULL`-Werten kann `NOT IN` unerwartete Ergebnisse liefern.
- `EXISTS`: Prüft nur auf die **Existenz** mindestens einer Zeile und bricht die Suche sofort nach dem ersten Treffer ab (*Short-Circuiting*). Das ist in den meisten Fällen deutlich performanter.
```sql
-- Finde Kunden mit mindestens einer Bestellung
SELECT k.id, k.name
FROM kunden k
WHERE EXISTS (
SELECT 1 FROM bestellungen b
WHERE b.kunde_id = k.id
);
```
### 2. Die vier Mengenoperatoren im Überblick
| Operator | Duplikate | Wirkung |
| :--- | :--- | :--- |
| `UNION` | Werden entfernt | Vereinigung aller disjunkten Zeilen beider Abfragen |
| `UNION ALL` | Bleiben erhalten | Schnelles Aneinanderhängen beider Ergebnismengen |
| `INTERSECT` | Werden entfernt | Nur Zeilen, die in beiden Mengen vorkommen |
| `EXCEPT` | Werden entfernt | Zeilen aus Menge A, die NICHT in Menge B vorkommen |
---
## 🚀 Aufgabenstellung (`aufgabe.sql`)
1. **TODO 1: Skalare Subquery & Preisabweichung** – Finde Produkte über dem Durchschnittspreis und berechne die Differenz zum Mittelwert.
2. **TODO 2: Korrelierte Subquery mit NOT EXISTS** – Identifiziere loyale Kunden (Kauf online vorhanden, aber noch nie eine Retoure eingereicht).
3. **TODO 3: Multi-Channel Konsolidierung** – Vereinige Online- und Filialumsätze mit `UNION ALL`.
4. **TODO 4: Omnichannel vs. Pure-Online Analyse** – Berechne mit `INTERSECT` Kunden, die beide Kanäle nutzen, und mit `EXCEPT` reine Online-Käufer.
---
## 🧪 Tests ausführen
Validierung erfolgt über `test_aufgabe.sql` in der Web-IDE oder lokal per SQLite.