In ihrer einfachsten Form ist eine Unterabfrage eine
Skalarunterabfrage, die einen Einzelwert zurückgibt. Eine
Skalarunterabfrage ist ein einfacher Operand, und Sie können
sie fast überall dort benutzen, wo ein einzelner Spaltenwert
oder ein Literal zulässig ist. Sie können dabei
voraussetzen, dass eine solche Unterabfrage die Eigenschaften
aufweist, die alle Operanden haben: einen Datentyp, eine
Länge, eine Angabe dazu, ob sie NULL
sein
darf oder nicht usw. Zum Beispiel:
CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL); INSERT INTO t1 VALUES(100, 'abcde'); SELECT (SELECT s2 FROM t1);
Die Unterabfrage in dieser SELECT
-Anweisung
gibt einen einzelnen Wert ('abcde'
)
zurück, der den Datentyp CHAR
und die
Länge 5 aufweist, Zeichensatz und Sortierfolge den mit
CREATE TABLE
konfigurierten Vorgaben
entnimmt und die Information enthält, dass der Wert in der
Spalte auch NULL
sein kann. Tatsächlich
können fast alle Unterabfragen NULL
werden. Wäre die im Beispiel verwendete Tabelle leer, dann
wäre der Wert der Unterabfrage NULL
.
Es gibt nur ganz wenig Kontexte, in denen eine skalare
Unterabfrage nicht verwendet werden kann. Wenn eine Anweisung
nur einen literalen Wert zulässt, können Sie keine
Unterabfrage einsetzen. So erfordert beispielsweise
LIMIT
literale Integer-Argumente, und
LOAD DATA INFILE
verlangt einen literalen
String für den Dateinamen. Zur Übermittlung solcher Werte
können Sie Unterabfragen nicht benutzen.
Wenn die Beispiele in den folgenden Abschnitten das recht
spartanische Konstrukt (SELECT column1 FROM
t1)
enthalten, dann vergegenwärtigen Sie sich, dass
Ihr eigener Code wesentlich komplexere und unterschiedlichere
Konstruktionen enthalten kann (und wird).
Nehmen wir an, wir erstellen zwei Tabellen:
CREATE TABLE t1 (s1 INT); INSERT INTO t1 VALUES (1); CREATE TABLE t2 (s1 INT); INSERT INTO t2 VALUES (2);
Nun führen Sie eine SELECT
-Anweisung aus:
SELECT (SELECT s1 FROM t2) FROM t1;
Das Ergebnis ist 2
, weil in Tabelle
t2
eine Spalte s1
vorhanden ist, die den Wert 2
hat.
Eine skalare Unterabfrage kann Teil eines Ausdrucks sein. Denken Sie aber immer an die Klammern – auch dann, wenn die Unterabfrage ein Operand ist, der ein Argument für eine Funktion bereitstellt. Zum Beispiel:
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;
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.