SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
UNION
wird verwendet, um das Ergebnis einer
Anzahl von SELECT
-Anweisungen zu einer
Ergebnismenge zusammenzufassen.
Ausgewählte Spalten, die an den entsprechenden Positionen
jeder SELECT
-Anweisung aufgelistet sind,
sollten vom selben Typ sein. (So sollte etwa die erste von der
ersten Anweisung ausgewählte Spalte denselben Typ haben wie
die erste von den anderen Anweisungen gewählte Spalte.) Die
in der ersten SELECT
-Anweisung verwendeten
Spaltennamen werden als Spaltennamen für die zurückgegebenen
Ergebnisse benutzt.
Die SELECT
-Anweisungen sind normale
Auswahlanweisungen, es gelten jedoch die folgenden
Einschränkungen:
Nur die letzte SELECT
-Anweisung kann
INTO OUTFILE
verwenden.
HIGH_PRIORITY
kann nicht bei
SELECT
-Anweisungen verwendet werden,
die Teil einer Union sind. Wenn Sie es für die erste
SELECT
-Anweisung angeben, hat dies
keine Auswirkungen. Bei einer Angabe für eine
nachfolgende SELECT
-Anweisung tritt ein
Syntaxfehler auf.
Geben Sie das Schlüsselwort ALL
an, dann
enthält das Ergebnis alle passenden Datensätze aus allen
SELECT
-Anweisungen. Wenn Sie
DISTINCT
angeben, werden doppelte
Datensätze aus dem Ergebnis entfernt. Wird kein
Schlüsselwort benutzt, dann entspricht das Standardverhalten
dem von DISTINCT
(Entfernung doppelter
Datensätze).
Das Schlüsselwort DISTINCT
ist optional
ohne Wirkung, ist aber in der Syntax zulässig, da der
SQL-Standard dies vorschreibt. (In MySQL stellt
DISTINCT
das Standardverhalten einer Union
dar.)
Sie können UNION ALL
und UNION
DISTINCT
in derselben Abfrage gemeinsam verwenden.
Derart gemischte UNION
-Typen werden
dahingehend verarbeitet, dass eine
DISTINCT
-Union Vorrang vor einer
ALL
-Union zu ihrer Linken hat. Eine
DISTINCT
-Union kann explizit mit
UNION DISTINCT
oder implizit durch
Verwendung von UNION
ohne nachfolgende
Schlüsselwörter DISTINCT
oder
ALL
erzeugt werden.
Wenn Sie eine ORDER BY
- oder
LIMIT
-Klausel zur Sortierung bzw.
Beschränkung des gesamten Ergebnisses der Union benutzen
wollen, setzen Sie die einzelnen
SELECT
-Anweisungen in Klammern und
platzieren Sie die ORDER BY
- oder
LIMIT
-Klausel an dem Ende. Das folgende
Beispiel verwendet beide Klauseln:
(SELECT a FROM t1 WHERE a=10 AND B=1) UNION (SELECT a FROM t2 WHERE a=11 AND B=2) ORDER BY a LIMIT 10;
Diese Art von ORDER BY
kann keine
Spaltenreferenzierungen verwenden, die einen Tabellennamen
enthalten (d. h. Namen im Format
tbl_name
.col_name
).
Geben Sie stattdessen einen Spaltenalias in der ersten
SELECT
-Anweisung an und referenzieren Sie
diesen Alias in der ORDER BY
-Klausel.
Alternativ können Sie die Spalten auch in der ORDER
BY
-Klausel unter Angabe ihrer Spaltenposition
referenzieren. (Ein Alias ist allerdings vorzuziehen, weil das
Angeben von Spaltenpositionen veraltet ist.)
Ferner muss, wenn einer zu sortierenden
Spalte ein Alias zugewiesen wird, die ORDER
BY
-Klausel den Alias und nicht den Spaltennamen
referenzieren. Die erste der folgenden Anweisungen
funktioniert – im Gegensatz zur zweiten, die mit dem Fehler
Unknown column 'a' in 'order clause'
fehlschlägt:
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b; (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;
Um ORDER BY
oder LIMIT
auf eine einzelne SELECT
-Anweisung
anzuwenden, setzen Sie die Klausel mit in die Klammern, die
die SELECT
-Anweisung umschließen:
(SELECT a FROMtbl_name
WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROMtbl_name
WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
Das Einfügen von ORDER BY
bei einzelnen
SELECT
-Anweisungen in Klammern hat nur in
Kombination mit LIMIT
Auswirkungen.
Andernfalls wird ORDER BY
wegoptimiert.
Typen und Längen der Spalten in der Ergebnismenge einer Union
berücksichtigen Werte, die von allen
SELECT
-Anweisungen abgerufen wurden.
Betrachten Sie etwa einmal Folgendes:
mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
+---------------+
| REPEAT('a',1) |
+---------------+
| a |
| bbbbbbbbbb |
+---------------+
In einigen früheren Versionen von MySQL würde der zweite Datensatz auf eine Länge von 1 gekürzt.
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.