56 lines
2.5 KiB
Markdown
56 lines
2.5 KiB
Markdown
# 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.
|