Subqueries: Unterschied zwischen den Versionen

Aus FI-Wiki
 
(19 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 14: Zeile 14:


{| class="wikitable"
{| class="wikitable"
|+ Text der Überschrift
! kundennr !! name  !! land
|-
|-
! Überschrift !! Überschrift !! Überschrift
| 1 || Anna  || Deutschland
|-
|-
| Beispiel || Beispiel || Beispiel
| 2 || Ben  || Deutschland
|-
|-
| Beispiel || Beispiel || Beispiel
| 3 || Clara || Österreich
|-
|-
| Beispiel || Beispiel || Beispiel
| 4 || David || Schweiz
|-
| 5 || Eva  || Deutschland
|}
|}


Zeile 28: 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 ===


| ! 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 ===
==== Skalare Subqueries in der WHERE-Klausel ====
 


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
Zeile 63: 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.
=== 2. Mehrzeilige Subquery mit IN ===
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT name
SELECT name
FROM kunde
FROM kunde
WHERE kundennr IN (
WHERE kundennr = (
     SELECT kundennr
     SELECT kundennr
     FROM bestellung
     FROM bestellung
     WHERE betrag > 1000
     WHERE betrag = (SELECT MIN(betrag) FROM bestellung)
);
);
</syntaxhighlight>
</syntaxhighlight>
'''Ergebnis:'''
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
name
name
------
------
Ben
Ben
David
</syntaxhighlight>
</syntaxhighlight>


Gibt alle Kunden zurück, die Bestellungen über 1000 haben.
Gibt den Namen des Kunden mit der kleinsten Bestellung zurück.
 
=== 3. Korrelierte Subquery ===


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT name
SELECT name
FROM kunde k
FROM kunde
WHERE EXISTS (
WHERE kundennr = (
     SELECT *
     SELECT kundennr
     FROM bestellung b
     FROM bestellung
     WHERE b.kundennr = k.kundennr AND b.betrag > 1000
     GROUP BY kundennr
    ORDER BY SUM(betrag) DESC
    LIMIT 1
);
);
</syntaxhighlight>
</syntaxhighlight>
 
<syntaxhighlight>
'''Ergebnis:'''
 
<syntaxhighlight lang="text">
name
name
------
------
Ben
Ben
David
</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:


Funktioniert zeilenweise: Gibt Kunden zurück, für die es mindestens eine große Bestellung gibt.
'''Skalare Subquery''':  
Sie liefert genau einen Wert zurück, da die Funktion <code>COUNT(*)</code> immer eine einzelne Zahl ergibt.


=== Vergleich der Subquery-Arten ===
'''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''': 1 Zeile, 1 Spalte (z. B. MAX, COUNT)
==== Skalare Subquery in der HAVING-Klausel ====
* '''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 ===
<syntaxhighlight lang="sql"> SELECT kundennr FROM bestellung GROUP BY kundennr HAVING SUM(betrag) > ( SELECT AVG(betrag) FROM bestellung ); </syntaxhighlight>


* Skalare Subquery: liefert genau einen Wert
Gibt Kunden-IDs zurück, deren Bestellsumme über dem durchschnittlichen Bestellwert liegt.
* 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]]

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
------
Ben

Gibt 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.