Subqueries: Unterschied zwischen den Versionen
| (18 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 30: | Zeile 30: | ||
{| class="wikitable" | {| 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 in der WHERE-Klausel ==== | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
| Zeile 65: | Zeile 68: | ||
Gibt den Namen des Kunden mit der höchsten Bestellung zurück. | Gibt den Namen des Kunden mit der höchsten Bestellung zurück. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT name | SELECT name | ||
FROM kunde | FROM kunde | ||
WHERE kundennr | WHERE kundennr = ( | ||
SELECT kundennr | SELECT kundennr | ||
FROM bestellung | FROM bestellung | ||
WHERE betrag | WHERE betrag = (SELECT MIN(betrag) FROM bestellung) | ||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
name | name | ||
------ | ------ | ||
Ben | Ben | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Gibt | Gibt den Namen des Kunden mit der kleinsten Bestellung zurück. | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT name | SELECT name | ||
FROM kunde | FROM kunde | ||
WHERE | WHERE kundennr = ( | ||
SELECT | SELECT kundennr | ||
FROM bestellung | FROM bestellung | ||
GROUP BY kundennr | |||
ORDER BY SUM(betrag) DESC | |||
LIMIT 1 | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight> | |||
<syntaxhighlight | |||
name | name | ||
------ | ------ | ||
Ben | Ben | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Gibt den Namen des Kunden mit dem höchsten Gesamtbestellwert zurück. | |||
==== 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> | |||
Zeigt zu jedem Kunden die Anzahl seiner Bestellungen an. | |||
Die Subquery ist: | |||
'''Skalare Subquery''': | |||
Sie liefert genau einen Wert zurück, da die Funktion <code>COUNT(*)</code> immer eine einzelne Zahl ergibt. | |||
== | '''Korrelierte Subquery''': | ||
Die Subquery bezieht sich auf die äußere Tabelle: | |||
<syntaxhighlight lang="sql"> | |||
WHERE bestellung.kundennr = kunde.kundennr | |||
</syntaxhighlight> | |||
Dadurch wird sie für jede Zeile der äußeren Abfrage erneut 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 Kunden-IDs zurück, deren Bestellsumme über dem durchschnittlichen Bestellwert liegt. | |||
[[Kategorie:Datenbanken]] | [[Kategorie:Datenbanken]] | ||
[[Kategorie:Semester2]] | [[Kategorie:Semester2]] | ||
Aktuelle Version vom 21. November 2025, 12:58 Uhr
Subqueries in SQL
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
SELECT name
FROM kunde
WHERE kundennr = (
SELECT kundennr
FROM bestellung
WHERE betrag = (SELECT MAX(betrag) FROM bestellung)
);
Ergebnis:
name
------
David
Gibt den Namen des Kunden mit der höchsten Bestellung zurück.
SELECT name
FROM kunde
WHERE kundennr = (
SELECT kundennr
FROM bestellung
WHERE betrag = (SELECT MIN(betrag) FROM bestellung)
);
name
------
Ben
Gibt den Namen des Kunden mit der kleinsten Bestellung zurück.
SELECT name
FROM kunde
WHERE kundennr = (
SELECT kundennr
FROM bestellung
GROUP BY kundennr
ORDER BY SUM(betrag) DESC
LIMIT 1
);
name
------
BenGibt den Namen des Kunden mit dem höchsten Gesamtbestellwert zurück.
Skalare Subquery in der SELECT-Klausel
SELECT name, (
SELECT COUNT(*)
FROM bestellung
WHERE bestellung.kundennr = kunde.kundennr
) AS anzahl_bestellungen
FROM kunde;
Zeigt zu jedem Kunden die Anzahl seiner Bestellungen an. 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
SELECT kundennr FROM bestellung GROUP BY kundennr HAVING SUM(betrag) > ( SELECT AVG(betrag) FROM bestellung );
Gibt Kunden-IDs zurück, deren Bestellsumme über dem durchschnittlichen Bestellwert liegt.
