Subqueries: Unterschied zwischen den Versionen

Aus FI-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 8: Zeile 8:


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


== Beispieltabellen ==
== Beispieltabellen ==
Zeile 42: Zeile 40:
| 105 || 2 || 300.00
| 105 || 2 || 300.00
|}
|}
---


== Skalare Subqueries ==
== Skalare Subqueries ==
Zeile 49: Zeile 45:
Skalare Subqueries liefern '''genau einen einzelnen Wert''' zurück   
Skalare Subqueries liefern '''genau einen einzelnen Wert''' zurück   
(z. B. MAX, MIN, COUNT, AVG).
(z. B. MAX, MIN, COUNT, AVG).
---


=== Skalare Subquery in der WHERE-Klausel ===
=== Skalare Subquery in der WHERE-Klausel ===


==== Kunde mit der höchsten Einzelbestellung ===
==== Kunde mit der höchsten Einzelbestellung ====
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT name
SELECT name
Zeile 74: Zeile 68:
Die innere Subquery ermittelt den '''höchsten Bestellbetrag'''.
Die innere Subquery ermittelt den '''höchsten Bestellbetrag'''.


---


==== Kunde mit der kleinsten Einzelbestellung ===
==== Kunde mit der kleinsten Einzelbestellung ====
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT name
SELECT name
Zeile 94: Zeile 87:
</syntaxhighlight>
</syntaxhighlight>


---
==== Kunde mit dem höchsten Gesamtbestellwert ====
 
==== Kunde mit dem höchsten Gesamtbestellwert ===
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT name
SELECT name
Zeile 116: Zeile 107:
</syntaxhighlight>
</syntaxhighlight>


---
==== Skalare Subquery in der SELECT-Klausel ====
 
=== Skalare Subquery in der SELECT-Klausel ===


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
Zeile 132: Zeile 121:
Diese Abfrage zeigt '''für jeden Kunden''' die Anzahl seiner Bestellungen.
Diese Abfrage zeigt '''für jeden Kunden''' die Anzahl seiner Bestellungen.


==== Warum ist das eine korrelierte Subquery? ===
==== Warum ist das eine korrelierte Subquery? ====
* Die Subquery greift auf die äußere Tabelle zu:
* Die Subquery greift auf die äußere Tabelle zu:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
Zeile 139: Zeile 128:
* Sie wird daher '''für jede Zeile der äußeren Abfrage neu ausgeführt'''
* Sie wird daher '''für jede Zeile der äußeren Abfrage neu ausgeführt'''


---


=== Skalare Subquery in der HAVING-Klausel ===
=== Skalare Subquery in der HAVING-Klausel ===
Zeile 154: Zeile 142:


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


=== Zusammenfassung ===
=== Zusammenfassung ===
Zeile 162: Zeile 148:
* Sie können in '''WHERE''', '''SELECT''' und '''HAVING''' verwendet werden   
* Sie können in '''WHERE''', '''SELECT''' und '''HAVING''' verwendet werden   
* Korrelierte Subqueries beziehen sich auf die äußere Abfrage und laufen zeilenweise   
* 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.
== 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 ===
{| 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 in der WHERE-Klausel ===
==== Beispiel 1 ====
Gibt den Namen des Kunden mit der höchsten Bestellung zurück.
==== Query ====
<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>
==== Beispiel 2====
Gibt den Namen des Kunden mit der kleinsten Bestellung zurück.
==== Query ====
<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>
==== Beispiel 3: ====
Gibt den Namen des Kunden mit dem höchsten Gesamtbestellwert zurück.
==== Query: ====
<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>
name
------
Ben
</syntaxhighlight>
=== Skalare Subquery in der SELECT-Klausel ===
==== Aufgabe: ====
Zeigt zu jedem Kunden die Anzahl seiner Bestellungen an.
==== Query: ====
<syntaxhighlight lang="sql">
SELECT name, (
  SELECT COUNT(*)
  FROM bestellung
  WHERE bestellung.kundennr = kunde.kundennr
) AS anzahl_bestellungen
FROM kunde;
</syntaxhighlight>
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 ===
==== Aufgabe: ====
Gibt Kunden-IDs zurück, deren Bestellsumme über dem durchschnittlichen Bestellwert liegt.
==== Query: ====
<syntaxhighlight lang="sql">
SELECT kundennr FROM bestellung
GROUP BY kundennr
HAVING SUM(betrag) > ( SELECT AVG(betrag) FROM bestellung );
</syntaxhighlight>


[[Kategorie:Datenbanken]]
[[Kategorie:Datenbanken]]
[[Kategorie:Semester2]]
[[Kategorie:Semester2]]

Version vom 11. Januar 2026, 12:17 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