JOIN vs. Subquery
Aus FI-Wiki
Dieser Artikel erklärt den Unterschied zwischen JOINs und Subqueries anhand einfacher Beispiele.
Grundprinzip
- JOIN → Tabellen werden miteinander verbunden
- Subquery → Eine Abfrage wird innerhalb einer anderen Abfrage verwendet
Beispieltabellen
Tabelle: kunde
| kundennr | name |
|---|---|
| 1 | Anna |
| 2 | Ben |
| 3 | Clara |
Tabelle: bestellung
| bestellnr | kundennr | betrag |
|---|---|---|
| 101 | 1 | 50 |
| 102 | 1 | 80 |
| 103 | 2 | 30 |
1. JOIN – Tabellen verbinden
Ziel: Bestellungen zusammen mit Kundennamen anzeigen
SELECT
k.name,
b.bestellnr,
b.betrag
FROM kunde k
JOIN bestellung b
ON k.kundennr = b.kundennr;
Ergebnis:
| name | bestellnr | betrag |
|---|---|---|
| Anna | 101 | 50 |
| Anna | 102 | 80 |
| Ben | 103 | 30 |
Wichtig:
- Ein Kunde kann mehrfach erscheinen
- Grund: 1:n-Beziehung (ein Kunde → mehrere Bestellungen)
Merksatz: JOIN verbindet passende Zeilen aus mehreren Tabellen.
2. Subquery – Teilfrage stellen
Ziel: Kunden anzeigen, die mindestens eine Bestellung haben
SELECT name
FROM kunde
WHERE kundennr IN (
SELECT kundennr
FROM bestellung
);
Ergebnis:
| name |
|---|
| Anna |
| Ben |
Wichtig:
- Clara erscheint nicht (keine Bestellung)
- Die Subquery liefert eine Liste von Kundennummern
Merksatz: Subquery liefert ein Zwischenergebnis für die äußere Abfrage.
3. Gleiche Aufgabe – zwei Lösungen
Ziel: Kunden mit Bestellungen anzeigen
Mit Subquery
SELECT name
FROM kunde
WHERE kundennr IN (
SELECT kundennr FROM bestellung
);
Mit JOIN
SELECT DISTINCT k.name
FROM kunde k
JOIN bestellung b
ON k.kundennr = b.kundennr;
Hinweis:
- DISTINCT ist notwendig, da ein Kunde mehrere Bestellungen haben kann
4. Subquery für Berechnungen
Ziel: Anzahl der Bestellungen pro Kunde
SELECT
name,
(
SELECT COUNT(*)
FROM bestellung b
WHERE b.kundennr = k.kundennr
) AS anzahl_bestellungen
FROM kunde k;
Ergebnis:
| name | anzahl_bestellungen |
|---|---|
| Anna | 2 |
| Ben | 1 |
| Clara | 0 |
Eigenschaften:
- skalare Subquery (liefert genau einen Wert)
- korrelierte Subquery (bezieht sich auf äußere Abfrage)
5. Gleiche Aufgabe mit JOIN
SELECT
k.name,
COUNT(b.bestellnr) AS anzahl_bestellungen
FROM kunde k
LEFT JOIN bestellung b
ON k.kundennr = b.kundennr
GROUP BY k.kundennr, k.name;
Warum LEFT JOIN?
- Damit auch Kunden ohne Bestellung angezeigt werden (z. B. Clara)
Warum GROUP BY?
- Mehrere Bestellungen müssen zu einer Zeile zusammengefasst werden
6. Wann JOIN, wann Subquery?
| Situation | Empfehlung |
|---|---|
| Daten aus mehreren Tabellen anzeigen | JOIN |
| Nur prüfen, ob Daten existieren | Subquery (EXISTS / IN) |
| Vergleich mit Durchschnitt / Summe | Subquery |
| Anzahl pro Datensatz berechnen | beides möglich |
| Alle Datensätze behalten (auch ohne Treffer) | LEFT JOIN |
Fazit
JOIN
- verbindet Tabellen
- liefert kombinierte Daten
Subquery
- beantwortet eine Teilfrage
- wird innerhalb einer Abfrage verwendet
Wichtiger Merksatz: JOIN = Tabellen verbinden Subquery = Ergebnis einer Abfrage weiterverwenden
