Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL UNION-Klausel

In MySQL die UNION -Klausel kombiniert die Ergebnisse mehrerer Abfragen in einer einzigen Ergebnismenge.

Beispiel

Angenommen, wir haben die folgenden Tabellen:

SELECT * FROM Teachers;
SELECT * FROM Students;

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
+-----------+-------------+

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
|         6 | Bill        |
+-----------+-------------+

Wir können den UNION einfügen Klausel zwischen diesen beiden SELECT Anweisungen, um alle Lehrer und Schüler zurückzugeben:

SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;

Ergebnis:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Bill        |
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

Die Spaltennamen werden aus dem ersten SELECT übernommen Aussage.

Standardmäßig ist die UNION -Klausel wendet implizit ein DISTINCT an Betrieb. Mit anderen Worten, es gibt standardmäßig nur eindeutige Werte zurück. Die obigen Ergebnisse enthalten also jeweils nur einen von Warren, Cathy und Bill. Dies trotz der Tatsache, dass die kombinierten Tische tatsächlich zwei Warrens, zwei Cathys und drei Bills enthalten (es gibt zwei Lehrer namens Cathy, einen Lehrer und einen Kunden namens Warren und zwei namens Bill sowie einen Schüler namens Bill).

Hier ist ein Beispiel, das explizit den DISTINCT verwendet Klausel:

SELECT TeacherName FROM Teachers
UNION DISTINCT
SELECT StudentName FROM Students;

Ergebnis:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Bill        |
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

Wir erhalten also dasselbe Ergebnis wie ohne DISTINCT Klausel.

Duplikate einschließen

Wir können den ALL verwenden Schlüsselwort, um doppelte Werte in die Ergebnisse aufzunehmen:

SELECT TeacherName FROM Teachers
UNION ALL
SELECT StudentName FROM Students;

Ergebnis:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Cathy       |
| Bill        |
| Bill        |
| Faye        |
| Jet         |
| Spike       |
| Ein         |
| Warren      |
| Bill        |
+-------------+

Dieses Mal haben wir zwölf Zeilen statt der acht, die wir in unserem ersten Beispiel bekommen haben.

Wir können sehen, dass beide Cathys zurückgegeben wurden und alle drei Rechnungen zurückgegeben wurden.

TABLE Aussagen

Ab MySQL 8.0.19 können wir die UNION verwenden -Klausel mit der TABLE Erklärung.

Hier ist ein Beispiel:

TABLE Teachers
UNION
TABLE Students;

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
+-----------+-------------+

Das entspricht der folgenden Abfrage:

SELECT * FROM Teachers
UNION
SELECT * FROM Students;

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
+-----------+-------------+

Sie werden feststellen, dass diese Anweisungen mehr Zeilen zurückgeben als in unserem ersten Beispiel zuvor. Das liegt daran, dass wir alle Spalten in der Tabelle auswählen, was zu Nicht-Duplikaten führt, wo zuvor ein Duplikat vorhanden war. Beispielsweise werden hier zwei Lehrer namens Bill zurückgegeben, während im vorherigen Beispiel nur einer zurückgegeben wurde. Das liegt daran, dass die TeacherId Spalten enthalten unterschiedliche Werte, daher sind die Zeilen keine Duplikate.

Verwendung von ORDER BY Klausel in Union-Abfragen

Wir können den ORDER BY verwenden -Klausel in jedem SELECT -Anweisung und/oder auf der kombinierten UNION Anfrage.

In jedem SELECT Aussage

Wenn wir den ORDER BY verwenden -Klausel im einzelnen SELECT Anweisungen innerhalb einer UNION Abfrage müssen wir jede SELECT einschließen Anweisung in Klammern:

(SELECT * FROM Teachers ORDER BY TeacherName ASC LIMIT 2)
UNION
(SELECT * FROM Students ORDER BY StudentName ASC LIMIT 2);

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         2 | Ben         |
|         5 | Bill        |
|         6 | Bill        |
|         4 | Ein         |
+-----------+-------------+

Beachten Sie, dass dabei die Ergebnisse für die Ausgabe nicht wirklich sortiert werden. Es ordnet die Ergebnisse nur zum Zweck der Bestimmung der Teilmenge der ausgewählten Zeilen, die abgerufen werden sollen, wenn LIMIT angewendet wird Klausel.

Verwenden Sie daher ORDER BY ohne das LIMIT Klausel hat keine Auswirkung auf die Ausgabe.

Im Ganzen UNION Abfrage

Wir können auch einen ORDER BY verwenden -Klausel für die gesamte Abfrage, sodass die gesamte Ausgabe zusammengeordnet wird.

In diesem Beispiel nehmen wir das vorherige Beispiel und ordnen die kombinierten Ergebnisse:

(SELECT * FROM Teachers ORDER BY TeacherName ASC LIMIT 2)
UNION
(SELECT * FROM Students ORDER BY StudentName ASC LIMIT 2)
ORDER BY TeacherName DESC;

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         4 | Ein         |
|         5 | Bill        |
|         6 | Bill        |
|         2 | Ben         |
+-----------+-------------+

Auch ohne ORDER BY -Klausel in jedem SELECT Anweisung, jede SELECT -Anweisung sollte immer noch in Klammern stehen, und der ORDER BY -Klausel (oder ein beliebiges LIMIT Klausel) sollte nach der letzten stehen.

(SELECT * FROM Teachers)
UNION
(SELECT * FROM Students)
ORDER BY TeacherName ASC;

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         2 | Ben         |
|         5 | Bill        |
|         6 | Bill        |
|         3 | Cathy       |
|         4 | Cathy       |
|         4 | Ein         |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         1 | Warren      |
|         5 | Warren      |
+-----------+-------------+

Wohlgemerkt, das Weglassen der Klammern führt zum gleichen Ergebnis wie das mit Klammern:

SELECT * FROM Teachers
UNION
SELECT * FROM Students
ORDER BY TeacherName ASC;

Ergebnis:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         2 | Ben         |
|         5 | Bill        |
|         6 | Bill        |
|         3 | Cathy       |
|         4 | Cathy       |
|         4 | Ein         |
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         1 | Warren      |
|         5 | Warren      |
+-----------+-------------+

Beachten Sie, dass, wenn eine zu sortierende Spalte einen Alias ​​verwendet, diese Spalte durch ihren Alias ​​(nicht den Spaltennamen) referenziert werden muss.

Beispiel:

(SELECT TeacherName t FROM Teachers)
UNION
(SELECT StudentName FROM Students)
ORDER BY t ASC;

Ergebnis:

+--------+
| t      |
+--------+
| Ben    |
| Bill   |
| Cathy  |
| Ein    |
| Faye   |
| Jet    |
| Spike  |
| Warren |
+--------+

Folgendes passiert, wenn wir den Alias ​​nicht verwenden:

(SELECT TeacherName t FROM Teachers)
UNION
(SELECT StudentName FROM Students)
ORDER BY TeacherName ASC;

Ergebnis:

ERROR 1054 (42S22): Unknown column 'TeacherName' in 'order clause'

Anzahl der Spalten

Die Anzahl der Spalten, die von jedem SELECT zurückgegeben werden Aussage muss gleich sein. Daher können wir Folgendes nicht tun:

SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;

Ergebnis:

ERROR 1222 (21000): The used SELECT statements have a different number of columns

Datentypen

Ausgewählte Spalten, die an den entsprechenden Positionen jedes SELECT aufgeführt sind -Anweisung sollte denselben Datentyp haben. Wenn dies jedoch nicht der Fall ist, werden die Typen und Längen der Spalten in der UNION Ergebnis berücksichtigt die von allen SELECT abgerufenen Werte Aussagen.

Folgendes passiert, wenn wir versuchen, den TeacherName zu kombinieren Spalte mit der StudentId Spalte:

SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students;

Ergebnis:

+-------------+
| TeacherName |
+-------------+
| Warren      |
| Ben         |
| Cathy       |
| Bill        |
| 1           |
| 2           |
| 3           |
| 4           |
| 5           |
| 6           |
+-------------+

Einige andere RDBMSs würden in diesem Fall einen Fehler erzeugen, aber MySQL schafft es, eine Ausgabe ohne Fehler zu erzeugen.