[+/-]
ANY
, IN
und
SOME
ALL
EXISTS
und NOT EXISTS
FROM
-Klausel
Eine Unterabfrage ist eine SELECT
-Anweisung
innerhalb einer anderen Anweisung.
Seit MySQL 4.1 werden alle Unterabfrageformen und -operationen, die der SQL-Standard vorsieht, ebenso unterstützt wie einige weitere Funktionen, die MySQL-spezifisch sind.
Hier ein Beispiel für eine Unterabfrage:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
In diesem Beispiel ist SELECT * FROM t1 ...
die äußere Abfrage (oder
äußere Anweisung), und (SELECT
column1 FROM t2)
ist die
Unterabfrage. Man sagt, die Unterabfrage
ist in der äußeren Abfrage verschachtelt,
und tatsächlich ist es möglich, Unterabfragen bis zu einer
beträchtlichen Tiefe zu verschachteln. Eine Unterabfrage muss
immer in Klammern stehen.
Unterabfragen haben die folgenden Vorteile:
Sie gestatten Abfragen, die strukturiert sind. Auf diese Weise ist es möglich, jeden Teil einer Anweisung zu isolieren.
Sie bieten alternative Wege zur Durchführung von Operationen, die andernfalls komplexe Joins und Unions erfordern würden.
Sie sind – zumindest nach Meinung vieler – lesbar. Die Unterabfragen waren die eigentliche Innovation, aufgrund derer man auf die Idee kam, SQL seinerzeit als „strukturierte Abfragesprache“ zu bezeichnen.
Hier eine Beispielanweisung, die die wichtigsten Aspekte der Unterabfragensyntax zeigt, wie sie im SQL-Standard spezifiziert ist und von MySQL unterstützt wird:
DELETE FROM t1 WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)= (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));
Eine Unterabfrage kann einen Skalar (einen einzelnen Wert), einen einzelnen Datensatz, eine einzelne Spalte oder eine Tabelle (d. h. eine oder mehrere Spalten von einem oder mehreren Datensätzen) zurückgeben. Man bezeichnet diese als Skalar-, Spalten-, Datensatz- und Tabellenunterabfragen. Unterabfragen, die einen bestimmten Ergebnistyp zurückgeben, können häufig nur in bestimmten Kontexten verwendet werden, die in den folgenden Abschnitten beschrieben werden.
Es gibt ein paar wenige Einschränkungen bezüglich des Typs der
Anweisungen, in denen Unterabfragen verwendet werden können.
Eine Unterabfrage kann die gleichen Schlüsselwörter oder
Klauseln enthalten wie eine gewöhnliche
SELECT
-Anweisung:
DISTINCT
, GROUP BY
,
ORDER BY
, LIMIT
, Joins,
Indexhinweise, UNION
-Konstrukte, Kommentare,
Funktionen usw.
Eine Einschränkung besteht darin, dass die äußere Anweisung
einer Unterabfrage einen der folgenden Typen aufweisen muss:
SELECT
, INSERT
,
UPDATE
, DELETE
,
SET
oder DO
. Eine weitere
Einschränkung ist die Tatsache, dass Sie eine Tabelle derzeit
nicht ändern und gleichzeitig in einer Unterabfrage eine
Auswahl aus dieser Tabelle treffen können. Dies gilt für
Anweisungen wie DELETE
,
INSERT
, REPLACE
,
UPDATE
und (da Unterabfragen in der
SET
-Klausel verwendet werden können)
LOAD DATA INFILE
. Eine umfassendere
Beschreibung der Einschränkungen bei Unterabfragen finden Sie
in Abschnitt I.3, „Beschränkungen von Unterabfragen“.
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.