Subqueries: Unterschied zwischen den Versionen

Aus FI-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 11: Zeile 11:
=== Beispieltabellen ===
=== Beispieltabellen ===


<syntaxhighlight lang="sql">
'''Tabelle: kunde'''
-- Tabelle Kunde
CREATE TABLE kunde (
    kundennr INT PRIMARY KEY,
    name VARCHAR(50),
    land VARCHAR(50)
);


INSERT INTO kunde VALUES
{| class="wikitable"
(1, 'Anna', 'Deutschland'),
(2, 'Ben', 'Deutschland'),
(3, 'Clara', 'Österreich'),
(4, 'David', 'Schweiz'),
(5, 'Eva', 'Deutschland');


-- Tabelle Bestellung
| ! kundennr !! name  !! land |  |      |  |            |
CREATE TABLE bestellung (
| --------------------------- | - | ----- | - | ----------- |
bestellnr INT PRIMARY KEY,
| 1                          |  | Anna  |  | Deutschland |
kundennr INT,
| -                          |  |      |  |            |
betrag DECIMAL(10,2),
| 2                          |  | Ben  |  | Deutschland |
FOREIGN KEY (kundennr) REFERENCES kunde(kundennr)
| -                          |  |      |  |            |
);
| 3                          |  | Clara |  | Österreich  |
| -                          |  |      |  |            |
| 4                          |  | David |  | Schweiz    |
| -                          |  |      |  |            |
| 5                          |  | Eva  |  | Deutschland |
| }                          |  |      |  |            |


INSERT INTO bestellung VALUES
'''Tabelle: bestellung'''
(101, 1, 900.00),
 
(102, 2, 1500.00),
{| class="wikitable"
(103, 3, 500.00),
 
(104, 4, 2200.00),
| ! bestellnr !! kundennr !! betrag |  |  |  |        |
(105, 2, 300.00); </syntaxhighlight>
| --------------------------------- | - | - | - | ------- |
| 101                               |  | 1 |  | 900.00 |
| -                                |  |  |  |        |
| 102                               |  | 2 |  | 1500.00 |
| -                                |  |  |  |        |
| 103                               |  | 3 |  | 500.00 |
| -                                |  |  |  |        |
| 104                               |  | 4 |  | 2200.00 |
| -                                |  |  |  |        |
| 105                               |  | 2 |  | 300.00 |
| }                                |  |  |  |        |


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

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

| | | | - | ----- | - | ----------- | | Anna | | Deutschland | | | | | | Ben | | Deutschland | | | | | | Clara | | Österreich | | | | | | David | | Schweiz | | | | | | Eva | | Deutschland | | | | |

Tabelle: bestellung

| | | | - | - | - | ------- | | 1 | | 900.00 | | | | | | 2 | | 1500.00 | | | | | | 3 | | 500.00 | | | | | | 4 | | 2200.00 | | | | | | 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