Eine korrelierte Unterabfrage ist eine Unterabfrage, die eine Tabelle referenziert, die auch in der äußeren Abfrage erscheint. Zum Beispiel:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
Beachten Sie, dass die Unterabfrage eine Spalte von
t1
referenziert, obwohl die
FROM
-Klausel der Unterabfrage keine Tabelle
t1
erwählt. Also sucht MySQL außerhalb
der Unterabfrage und findet t1
in der
äußeren Abfrage.
Angenommen, Tabelle t1
enthielte einen
Datensatz, bei dem column1 = 5
und
column2 = 6
sind. Gleichzeitig enthält
Tabelle t2
einen Datensatz, bei dem
column1 = 5
und column2 =
7
sind. Der einfache Ausdruck ... WHERE
column1 = ANY (SELECT column1 FROM t2)
wäre wahr,
aber in diesem Beispiel ist die
WHERE
-Klausel innerhalb der Unterabfrage
falsch (weil nämlich (5,6)
nicht gleich
(5,7)
); also ist auch die Unterabfrage als
Ganzes falsch.
Bereichsregel: MySQL wertet von innen nach außen aus. Zum Beispiel:
SELECT column1 FROM t1 AS x WHERE x.column1 = (SELECT column1 FROM t2 AS x WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1));
In dieser Anweisung muss x.column2
eine
Spalte in der Tabelle t2
sein, weil
SELECT column1 FROM t2 AS x ...
t2
umbenennt. Es ist keine Spalte in
Tabelle t1
, weil SELECT column1
FROM t1 ...
eine äußere Abfrage ist, die
weiter außen ist.
Bei Unterabfragen in HAVING
- oder
ORDER BY
-Klauseln sucht MySQL auch nach
Spaltennamen in der äußeren Auswahlliste.
In bestimmten Fällen wird eine korrelierte Unterabfrage optimiert. Zum Beispiel:
val
IN (SELECTkey_val
FROMtbl_name
WHEREcorrelated_condition
)
Andernfalls sind sie ineffizient und zudem wahrscheinlich recht langsam. Das Umschreiben der Abfrage als Join kann die Leistung unter Umständen verbessern.
Korrelierte Unterabfragen können Ergebnisse von Zusammenfassungsfunktionen in der äußeren Abfrage nicht referenzieren.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.