Database
 sql >> Datenbank >  >> RDS >> Database

SQL UNION-Klausel für Anfänger

In SQL die UNION -Klausel verkettet die Ergebnisse zweier Abfragen zu einer einzigen Ergebnismenge.

Sie können die UNION verwenden -Klausel mit oder ohne ALL Argument:

  • UNION ALL – Enthält Duplikate.
  • UNION – Schließt Duplikate aus.

Nachfolgend finden Sie einige grundlegende Beispiele, um zu demonstrieren, wie es funktioniert.

Beispieltabellen

Angenommen, wir haben zwei Tabellen:Cats und Dogs

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+

Wir können ein SELECT verwenden Anweisung mit einer UNION -Klausel, um die Ergebnisse aus beiden Tabellen in einer Ergebnismenge zu kombinieren.

Beispiel mit UNION ALL

Lassen Sie uns zuerst UNION ALL verwenden damit es Duplikate enthält.

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;

Ergebnis:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
| Meow      |
| Fluffy    |
| Scratch   |
+-----------+
(7 rows affected)

In diesem Fall werden sieben Zeilen zurückgegeben. Wir können sehen, dass „Fetch“ zweimal zurückgegeben wird. Das liegt daran, dass es zwei Hunde namens Fetch gibt.

Es gibt auch eine Katze und einen Hund mit demselben Namen:Fluffy.

Beachten Sie, dass ich einen Spaltenalias verwendet habe, um das von der Operation zurückgegebene Feld zu benennen. Wenn ich das nicht getan hätte, hätte das Ergebnis die Spaltennamen aus der ersten Abfrage verwendet. In diesem Fall hätte die Spaltenüberschrift DogName heißen müssen statt PetName .

SELECT DogName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;

Ergebnis:

+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
| Meow      |
| Fluffy    |
| Scratch   |
+-----------+
(7 rows affected)

Abhängig von den Daten, die Sie in Ihrer Abfrage zurückgeben, kann dies akzeptabel sein oder nicht. In unserem Fall ist es nicht angemessen, da nicht alle Ergebnisse Hunde sind.

Beispiel mit UNION

Mal sehen, was passiert, wenn wir ALL entfernen Argument.

SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;

Ergebnis:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Meow      |
| Scratch   |
| Wag       |
+-----------+
(5 rows affected)

Diesmal werden nur fünf Zeilen zurückgegeben. Beide Duplikate werden entfernt.

UNION vs DISTINCT

Beachten Sie, dass sich dies von der Anwendung von DISTINCT unterscheidet zu jedem einzelnen SELECT Erklärung. Wenn wir das getan hätten, wäre Fluffy zweimal zurückgegeben worden, weil die ALL würde nur für SELECT gelten Aussage, gegen die es angewendet wird (nicht auf die verketteten Ergebnisse).

Hier ist ein Beispiel, um zu veranschaulichen, was ich meine.

SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;

Ergebnis:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fluffy    |
| Meow      |
| Scratch   |
+-----------+
(6 rows affected)

Alle Abfragen müssen die gleiche Anzahl von Spalten zurückgeben

Wenn Sie die UNION verwenden -Klausel muss jede Abfrage die gleiche Anzahl von Spalten haben und sie müssen in der gleichen Reihenfolge sein.

Andernfalls erhalten Sie eine Fehlermeldung.

SELECT CatName FROM Cats
UNION ALL
SELECT DogId, DogName FROM Dogs;

Ergebnis:

Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Das ist der Fehler, den SQL Server zurückgibt, wenn eine ungleiche Anzahl von Spalten verwendet wird. Dieser spezielle Fehler weist darauf hin, dass die gleiche Einschränkung auch für INTERSECT gilt und EXCEPT Betreiber. Die Fehlermeldung, die Sie erhalten, kann je nach DBMS unterschiedlich sein.

Datentypen müssen kompatibel sein

Zusätzlich zur erforderlichen Anzahl von Spalten müssen diese Spalten einen kompatiblen Datentyp haben.

Sie müssen nicht unbedingt vom gleichen Datentyp sein, aber sie müssen kompatibel sein. Das heißt, sie müssen durch implizite Konvertierung kompatibel sein. Wenn die Datentypen nicht übereinstimmen, muss das DBMS in der Lage sein, eine implizite Konvertierung durchzuführen, damit sie übereinstimmen.

Andernfalls erhalten Sie eine Fehlermeldung.

SELECT CatName FROM Cats
UNION ALL
SELECT DogId FROM Dogs;

Ergebnis:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Meow' to data type int.

Ordnen der Ergebnisse

Wenn Sie die Ergebnisse mit dem ORDER BY sortieren möchten -Klausel müssen Sie sie in die letzte Abfrage einfügen. Sie können keinen separaten ORDER BY angeben -Klausel für jede Abfrage oder für jede Abfrage, die nicht die letzte ist.

Hier ist der Fehler, den ich bekomme, wenn ich das in SQL Server versuche:

SELECT DogName AS PetName
FROM Dogs
ORDER BY DogName
UNION ALL
SELECT CatName
FROM Cats;

Ergebnis:

Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'UNION'.

Wenn wir die Ergebnisse ordnen möchten, müssen wir daher etwa so vorgehen:

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
ORDER BY PetName;

Anwenden von UNION zu den mehr als zwei Abfragen

Die vorherigen Beispiele kombinierten Ergebnisse aus zwei verschiedenen Abfragen, aber nichts hindert Sie daran, weitere hinzuzufügen. Sie können damit bei Bedarf die Ergebnisse vieler Abfragen kombinieren.

Zum Beispiel, wenn wir auch einen Birds hätten Tabelle, könnten wir dies tun:

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
UNION ALL
SELECT BirdName
FROM Birds;

Normalisierung

Die Beispiele auf dieser Seite setzen Katzen und Hunde in zwei separate Tabellen. Der Grund, warum ich das getan habe, ist, dass es eine klare und prägnante Art ist, zu veranschaulichen, wie UNION funktioniert.

In der Praxis könnten Sie diese in derselben Tabelle namens Pets haben , haben dann separate PetTypes Tisch (oder ähnliches). Dies wird als Normalisierung bezeichnet und ist die Art und Weise, wie relationale Datenbanken normalerweise entworfen werden.

Sie könnten dann einen Join für diese Tabellen ausführen, um die erforderlichen Daten zurückzugeben.