Bis zu diesem Punkt haben wir ausschließlich Skalar- und Spaltenunterabfragen beschrieben, also Unterabfragen, die einen einzelnen Wert oder eine Wertespalte zurückgeben. Eine Datensatzunterabfrage ist eine Unterabfragenvariante, die einen einzelnen Datensatz zurückgibt – und insofern auch mehrere Spaltenwerte zurückgeben kann. Hier zwei Beispiele:
SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2); SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);
Die gezeigten Abfragen sind beide wahr, wenn Tabelle
t2
einen Datensatz enthält, bei dem
column1 = 1
und column2 =
2
sind.
Die Ausdrücke (1,2)
und
ROW(1,2)
heißen manchmal auch
Datensatzkonstruktoren. Beide sind
äquivalent. Sie sind zudem auch in anderen Kontexten
zulässig. So sind etwa die beiden folgenden Anweisungen
semantisch äquivalent (obwohl derzeit nur die zweite
optimiert werden kann):
SELECT * FROM t1 WHERE (column1,column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
Der normale Anwendungsfall von Datensatzkonstruktoren sind
Vergleiche mit Unterabfragen, die zwei oder mehr Spalten
zurückgeben. So entspricht die folgende Abfrage der
Aufforderung „Suche alle Datensätze in Tabelle
t1
, die auch in Tabelle
t2
vorhanden sind“:
SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3) IN (SELECT column1,column2,column3 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.