Subqueries: Unterschied zwischen den Versionen

Aus FI-Wiki
Zeile 31: Zeile 31:
{| class="wikitable"
{| class="wikitable"


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


=== 1. Skalare Subquery ===
=== 1. Skalare Subquery ===

Version vom 29. Oktober 2025, 10:51 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 }

1. Skalare Subquery

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.

2. Mehrzeilige Subquery mit IN

SELECT name
FROM kunde
WHERE kundennr IN (
    SELECT kundennr
    FROM bestellung
    WHERE betrag > 1000
);

Ergebnis:

name
------
Ben
David

Gibt alle Kunden zurück, die Bestellungen über 1000 haben.

3. Korrelierte Subquery

SELECT name
FROM kunde k
WHERE EXISTS (
    SELECT *
    FROM bestellung b
    WHERE b.kundennr = k.kundennr AND b.betrag > 1000
);

Ergebnis:

name
------
Ben
David

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

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