Regeln


  • Ist immer ein SELECT-Statement
  • Immer in runden Klammern
  • Kein eigenes Ende, nur ein Semikolon am Ende der gesamten Abfrage
  • Können mit INSERT-, DELETE-, UPDATE- und SELECT-Statements verwendet werden
  • Können an vier Stellen in einer SELECT-Anweisung verwendet werden:
    • SELECT
    • WHERE
    • GROUP BY
    • HAVING

Korrelation


Korrelation beschreibt, ob die Unterabfrage abhängig von der äußeren Abfrage ist.

Nicht korrelierte Unterabfrage

  • Unabhängig von der äußeren Abfrage
  • Innere Abfrage wird vom DBMS zuerst ausgeführt
  • Wird ein einziges Mal ausgeführt Beispiel
SELECT name, gehalt
FROM mitarbeiter
WHERE gehalt > (
    SELECT AVG(gehalt)
    FROM mitarbeiter
);

Korrelierte Unterabfrage

  • Unterabfrage hängt vom aktuellen Datensatz der äußeren Abfrage ab
  • Innere Abfrage wird für jede Zeile der äußeren Abfrage neu ausgeführt
  • Dauert möglicherweise sehr lange

Beispiel

SELECT name, gehalt, abteilung
FROM mitarbeiter m1
WHERE gehalt > (
    SELECT AVG(gehalt)
    FROM mitarbeiter m2
    WHERE m2.abteilung = m1.abteilung
);

Snippets


Eklige Aufgabe Einnahmen pro Sportart und Gesamteinnahmen

SELECT
    so.Sportart,
    (
        SELECT COUNT(lmsi.Sport_ID) * so.Beitrag
        FROM link_mitglied_sportart lmsi
        WHERE lmsi.Sport_ID = so.Sport_Id
    ) AS Einnahmen,
    (
        (
        SELECT COUNT(lmsi.Sport_ID) * so.Beitrag
        FROM link_mitglied_sportart lmsi
        WHERE lmsi.Sport_ID = so.Sport_Id
    ) * 100 / (
        SELECT Sum(sub2_s.Beitrag)
		FROM sportart sub2_s
        INNER JOIN link_mitglied_sportart sub2_l ON sub2_s.Sport_ID = sub2_l.Sport_ID
    )
    )AS AnteilAnGesamt,
    (
        SELECT Sum(sub2_s.Beitrag)
		FROM sportart sub2_s
        INNER JOIN link_mitglied_sportart sub2_l ON sub2_s.Sport_ID = sub2_l.Sport_ID
    ) as Gesamt
FROM sportart so;