Subqueries: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
'''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''' | |||
{| class="wikitable" | |||
! kundennr !! name !! land | |||
|- | |||
| 1 || Anna || Deutschland | |||
|- | |||
| 2 || Ben || Deutschland | |||
|- | |||
| 3 || Clara || Österreich | |||
|- | |||
| 4 || David || Schweiz | |||
|- | |||
| 5 || Eva || Deutschland | |||
|} | |||
'''Tabelle: bestellung''' | |||
{| class="wikitable" | |||
! 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 === | |||
<syntaxhighlight lang="sql"> | |||
SELECT name | |||
FROM kunde | |||
WHERE kundennr = ( | |||
SELECT kundennr | |||
FROM bestellung | |||
WHERE betrag = (SELECT MAX(betrag) FROM bestellung) | |||
); | |||
</syntaxhighlight> | |||
'''Ergebnis:''' | |||
<syntaxhighlight lang="text"> | |||
name | |||
------ | |||
David | |||
</syntaxhighlight> | |||
Die innere Subquery ermittelt den '''höchsten Bestellbetrag'''. | |||
--- | |||
==== Kunde mit der kleinsten Einzelbestellung === | |||
<syntaxhighlight lang="sql"> | |||
SELECT name | |||
FROM kunde | |||
WHERE kundennr = ( | |||
SELECT kundennr | |||
FROM bestellung | |||
WHERE betrag = (SELECT MIN(betrag) FROM bestellung) | |||
); | |||
</syntaxhighlight> | |||
'''Ergebnis:''' | |||
<syntaxhighlight lang="text"> | |||
name | |||
------ | |||
Ben | |||
</syntaxhighlight> | |||
--- | |||
==== Kunde mit dem höchsten Gesamtbestellwert === | |||
<syntaxhighlight lang="sql"> | |||
SELECT name | |||
FROM kunde | |||
WHERE kundennr = ( | |||
SELECT kundennr | |||
FROM bestellung | |||
GROUP BY kundennr | |||
ORDER BY SUM(betrag) DESC | |||
LIMIT 1 | |||
); | |||
</syntaxhighlight> | |||
'''Ergebnis:''' | |||
<syntaxhighlight lang="text"> | |||
name | |||
------ | |||
Ben | |||
</syntaxhighlight> | |||
--- | |||
=== Skalare Subquery in der SELECT-Klausel === | |||
<syntaxhighlight lang="sql"> | |||
SELECT name, | |||
( | |||
SELECT COUNT(*) | |||
FROM bestellung | |||
WHERE bestellung.kundennr = kunde.kundennr | |||
) AS anzahl_bestellungen | |||
FROM kunde; | |||
</syntaxhighlight> | |||
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: | |||
<syntaxhighlight lang="sql"> | |||
bestellung.kundennr = kunde.kundennr | |||
</syntaxhighlight> | |||
* Sie wird daher '''für jede Zeile der äußeren Abfrage neu ausgeführt''' | |||
--- | |||
=== Skalare Subquery in der HAVING-Klausel === | |||
<syntaxhighlight lang="sql"> | |||
SELECT kundennr | |||
FROM bestellung | |||
GROUP BY kundennr | |||
HAVING SUM(betrag) > ( | |||
SELECT AVG(betrag) | |||
FROM bestellung | |||
); | |||
</syntaxhighlight> | |||
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 | |||
[[Kategorie:Datenbanken]] | |||
[[Kategorie:Semester2]] | |||
----- | |||
Subqueries (Unterabfragen) sind [[SQL]]-Abfragen, die innerhalb einer anderen Abfrage eingebettet sind. Sie liefern Zwischenergebnisse, die in der äußeren Abfrage verwendet werden. | Subqueries (Unterabfragen) sind [[SQL]]-Abfragen, die innerhalb einer anderen Abfrage eingebettet sind. Sie liefern Zwischenergebnisse, die in der äußeren Abfrage verwendet werden. | ||
Version vom 11. Januar 2026, 12:15 Uhr
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
------
BenSkalare 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 );
