|
|
| Zeile 65: |
Zeile 65: |
| Gibt den Namen des Kunden mit der höchsten Bestellung zurück. | | Gibt den Namen des Kunden mit der höchsten Bestellung zurück. |
|
| |
|
| === 2. Mehrzeilige Subquery mit IN ===
| |
|
| |
|
| <syntaxhighlight lang="sql">
| |
| SELECT name
| |
| FROM kunde
| |
| WHERE kundennr IN (
| |
| SELECT kundennr
| |
| FROM bestellung
| |
| WHERE betrag > 1000
| |
| );
| |
| </syntaxhighlight>
| |
|
| |
| '''Ergebnis:'''
| |
|
| |
| <syntaxhighlight lang="text">
| |
| name
| |
| ------
| |
| Ben
| |
| David
| |
| </syntaxhighlight>
| |
|
| |
| Gibt alle Kunden zurück, die Bestellungen über 1000 haben.
| |
|
| |
| === 3. Korrelierte Subquery ===
| |
|
| |
| <syntaxhighlight lang="sql">
| |
| SELECT name
| |
| FROM kunde k
| |
| WHERE EXISTS (
| |
| SELECT *
| |
| FROM bestellung b
| |
| WHERE b.kundennr = k.kundennr AND b.betrag > 1000
| |
| );
| |
| </syntaxhighlight>
| |
|
| |
| '''Ergebnis:'''
| |
|
| |
| <syntaxhighlight lang="text">
| |
| name
| |
| ------
| |
| Ben
| |
| David
| |
| </syntaxhighlight>
| |
|
| |
| Funktioniert zeilenweise: Gibt Kunden zurück, für die es mindestens eine große Bestellung gibt.
| |
|
| |
| === Vergleich der Subquery-Arten ===
| |
|
| |
| * '''Skalare Subquery''': 1 Zeile, 1 Spalte (z. B. MAX, COUNT)
| |
| * '''Mehrzeilige Subquery''': mehrere Zeilen (z. B. für IN oder NOT IN)
| |
| * '''Korrelierte Subquery''': wird für jede Zeile der äußeren Abfrage neu ausgeführt
| |
|
| |
| === Unterschied zwischen mehrzeiliger und korrelierter Subquery ===
| |
| '''Mehrzeilige Subquery:'''
| |
|
| |
| * Wird einmal ausgeführt.
| |
|
| |
| * Gibt eine Liste von Werten zurück.
| |
|
| |
| * Wird typischerweise mit IN, ANY, ALL, NOT IN verwendet.
| |
|
| |
| * Ist unabhängig von der äußeren Abfrage.
| |
|
| |
| '''Korrelierte Subquery:'''
| |
|
| |
| * Wird für jede Zeile der äußeren Abfrage neu ausgeführt.
| |
|
| |
| * Nutzt eine Referenz auf die äußere Tabelle (z. B. k.kundennr).
| |
|
| |
| * Typisch in Verbindung mit EXISTS oder auch IN, =, etc.
| |
|
| |
| * Ist abhängig von der aktuellen Zeile der äußeren Abfrage.
| |
|
| |
| === Fazit ===
| |
|
| |
| * Skalare Subquery: liefert genau einen Wert
| |
| * Mehrzeilige Subquery: liefert eine Liste von Werten
| |
| * Korrelierte Subquery: ist abhängig von der äußeren Zeile und flexibler, aber ggf. langsamer
| |
|
| |
|
| [[Kategorie:Datenbanken]] | | [[Kategorie:Datenbanken]] |
| [[Kategorie:Semester2]] | | [[Kategorie:Semester2]] |
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
|
1. Skalare Subquery
SELECT name
FROM kunde
WHERE kundennr = (
SELECT kundennr
FROM bestellung
WHERE betrag = (SELECT MAX(betrag) FROM bestellung)
);
Ergebnis:
Gibt den Namen des Kunden mit der höchsten Bestellung zurück.