Subqueries

Aus FI-Wiki

Subqueries (Unterabfragen) sind SQL-Abfragen, die innerhalb einer anderen Abfrage eingebettet sind. Sie liefern Zwischenergebnisse, die von der äußeren Abfrage weiterverarbeitet werden.

Arten von Subqueries

  • Skalare Subquery – liefert genau einen Wert zurück
  • Mehrzeilige Subquery – liefert mehrere Werte (z. B. für IN)
  • Korrelierte Subquery – bezieht sich auf die aktuelle Zeile der äußeren Abfrage

In diesem Abschnitt werden skalare Subqueries anhand von Beispielen erklärt.

---

Beispieltabellen

Tabelle: kunde

kundennr name land
1 Anna Deutschland
2 Ben Deutschland
3 Clara Österreich
4 David Schweiz
5 Eva Deutschland

Tabelle: bestellung

bestellnr kundennr betrag
101 1 900.00
102 2 1500.00
103 3 500.00
104 4 2200.00
105 2 300.00

---

Skalare Subqueries

Skalare Subqueries liefern genau einen einzelnen Wert zurück (z. B. MAX, MIN, COUNT, AVG).

---

Skalare Subquery in der WHERE-Klausel

= Kunde mit der höchsten Einzelbestellung

SELECT name
FROM kunde
WHERE kundennr = (
    SELECT kundennr
    FROM bestellung
    WHERE betrag = (SELECT MAX(betrag) FROM bestellung)
);

Ergebnis:

name
------
David

Die innere Subquery ermittelt den höchsten Bestellbetrag.

---

= Kunde mit der kleinsten Einzelbestellung

SELECT name
FROM kunde
WHERE kundennr = (
    SELECT kundennr
    FROM bestellung
    WHERE betrag = (SELECT MIN(betrag) FROM bestellung)
);

Ergebnis:

name
------
Ben

---

= Kunde mit dem höchsten Gesamtbestellwert

SELECT name
FROM kunde
WHERE kundennr = (
    SELECT kundennr
    FROM bestellung
    GROUP BY kundennr
    ORDER BY SUM(betrag) DESC
    LIMIT 1
);

Ergebnis:

name
------
Ben

---

Skalare Subquery in der SELECT-Klausel

SELECT name,
(
    SELECT COUNT(*)
    FROM bestellung
    WHERE bestellung.kundennr = kunde.kundennr
) AS anzahl_bestellungen
FROM kunde;

Diese Abfrage zeigt für jeden Kunden die Anzahl seiner Bestellungen.

= Warum ist das eine korrelierte Subquery?

  • Die Subquery greift auf die äußere Tabelle zu:
bestellung.kundennr = kunde.kundennr
  • Sie wird daher für jede Zeile der äußeren Abfrage neu ausgeführt

---

Skalare Subquery in der HAVING-Klausel

SELECT kundennr
FROM bestellung
GROUP BY kundennr
HAVING SUM(betrag) > (
    SELECT AVG(betrag)
    FROM bestellung
);

Gibt alle Kunden zurück, deren Bestellsumme über dem Durchschnitt liegt.

---

Zusammenfassung

  • Subqueries sind Abfragen innerhalb von Abfragen
  • Skalare Subqueries liefern genau einen Wert
  • Sie können in WHERE, SELECT und HAVING verwendet werden
  • Korrelierte Subqueries beziehen sich auf die äußere Abfrage und laufen zeilenweise

Subqueries (Unterabfragen) sind SQL-Abfragen, die innerhalb einer anderen Abfrage eingebettet sind. Sie liefern Zwischenergebnisse, die in der äußeren Abfrage verwendet werden.

Arten von Subqueries

  • Skalare Subquery: Gibt genau einen Wert zurück
  • Mehrzeilige Subquery: Gibt eine Liste von Werten zurück
  • Korrelierte Subquery: Bezieht sich auf eine Tabelle der äußeren Abfrage

Beispieltabellen

Tabelle: kunde

kundennr name land
1 Anna Deutschland
2 Ben Deutschland
3 Clara Österreich
4 David Schweiz
5 Eva Deutschland

Tabelle: bestellung

bestellnr kundennr betrag
101 1 900.00
102 2 1500.00
103 3 500.00
104 4 2200.00
105 2 300.00

Skalare Subqueries

Skalare Subqueries in der WHERE-Klausel

Beispiel 1

Gibt den Namen des Kunden mit der höchsten Bestellung zurück.

Query

SELECT name
FROM kunde
WHERE kundennr = (
    SELECT kundennr
    FROM bestellung
    WHERE betrag = (SELECT MAX(betrag) FROM bestellung)
);

Ergebnis:

name
------
David

Beispiel 2

Gibt den Namen des Kunden mit der kleinsten Bestellung zurück.

Query

SELECT name
FROM kunde
WHERE kundennr = (
    SELECT kundennr
    FROM bestellung
    WHERE betrag = (SELECT MIN(betrag) FROM bestellung)
);

Ergebnis:

name
------
Ben

Beispiel 3:

Gibt den Namen des Kunden mit dem höchsten Gesamtbestellwert zurück.

Query:

SELECT name
FROM kunde
WHERE kundennr = (
    SELECT kundennr
    FROM bestellung
    GROUP BY kundennr
    ORDER BY SUM(betrag) DESC
    LIMIT 1
);

Ergebnis:

name
------
Ben

Skalare Subquery in der SELECT-Klausel

Aufgabe:

Zeigt zu jedem Kunden die Anzahl seiner Bestellungen an.

Query:

 
SELECT name, (
   SELECT COUNT(*) 
   FROM bestellung 
   WHERE bestellung.kundennr = kunde.kundennr
) AS anzahl_bestellungen 
FROM kunde;

Die Subquery ist:

Skalare Subquery: Sie liefert genau einen Wert zurück, da die Funktion COUNT(*) immer eine einzelne Zahl ergibt.

Korrelierte Subquery: Die Subquery bezieht sich auf die äußere Tabelle:

WHERE bestellung.kundennr = kunde.kundennr

Dadurch wird sie für jede Zeile der äußeren Abfrage erneut ausgeführt.

Skalare Subquery in der HAVING-Klausel

Aufgabe:

Gibt Kunden-IDs zurück, deren Bestellsumme über dem durchschnittlichen Bestellwert liegt.

Query:

 
SELECT kundennr FROM bestellung 
GROUP BY kundennr 
HAVING SUM(betrag) > ( SELECT AVG(betrag) FROM bestellung );