## Mengenoperationen: UNION, INTERSECT, EXCEPT

Es gibt eine Reihe von Möglichkeiten, Ergebnisse aus mehreren Ergebnistabellen miteinander in Beziehung zu setzen und daraus eine neue Ergebnistabelle zu erzeugen.

### Voraussetzungen

Sie benötigen die Demo-Daten für das SQL-Tutorial.

Starten Sie das Query Tool SQL Studio als Datenbankadministrator MONA mit dem Kennwort RED und melden Sie sich an die Demo-Datenbankinstanz DEMODB an.

### UNION

Die UNION-Anweisung erlaubt es Ihnen, aus mehreren SELECT-Anweisungen eine Vereinigungsmenge der einzelnen Ergebnistabellen zu erzeugen.

Im einfachsten Fall können Sie zwei Ergebnistabellen, die aus der gleichen Basistabelle gebildet wurden, miteinander verknüpfen.

Mit Hilfe der UNION-Anweisung können Sie auch Ergebnistabellen kombinieren, die aus unterschiedlichen Tabellen gebildet wurden. Es muss dabei jedoch gewährleistet sein, dass die Datentypen der jeweiligen i-ten Ausgabespalten vergleichbar sind. Eine Gleichheit ist nicht erforderlich, da gegebenenfalls die maximale Länge genutzt wird.

SELECT zip customer_zip FROM hotel.c ustomer WHERE zip > '90000'

SELECT zip hotel_zip FROM hotel.hotel WHERE zip> '90000'

Anzeige der Postleitzahlen größer 90000.

Ergebnistabellen

CUSTOMER_ZIP |  | HOTEL_ZIP
90018 |  | 90804
97213 |  | 90029
95054 |  | 92262
90018 |  |
92714 |  |

SELECT zip FROM hotel.customer WHERE zip > '90000'
UNION
SELECT zip FROM hotel.hotel WHERE zip > '90000'

Anzeige aller Postleitzahlen aus der Kunden- und der Hoteltabelle, die größer als 90000 sind.

Ergebnis

ZIP
90018
90029
92262
90804
97213
92714
95054

Mehrmals auftauchende Postleitzahlen werden nur einmal angezeigt, da das Datenbanksystem implizit ein DISTINCT durchführt.

Sollen alle Postleitzahlen in der Häufigkeit ihres Auftretens angezeigt werden, so verwenden Sie UNION ALL.

SELECT hno hno_or_cno, name hotel_or_customer_name, zip
FROM hotel.hotel WHERE zip < '30000'
UNION
SELECT cno, name, zip
FROM hotel.customer WHERE zip < '30000'

Anzeige aller Orte, in denen sich entweder ein Hotel befindet oder einer der Kunde wohnt

Ergebnis

HNO_OR_CNO | HOTEL_OR_CUSTOMER_NAME | ZIP
3000 | Porter | 10580
30 | Regency | 20037
4300 | TOOLware | 20019
4400 | Jenkins | 20903
10 | Congress | 20005
3400 | Griffith | 20005
80 | Midtown | 10019
20 | Long Island | 11788
70 | Empire State | 12203
40 | Eighth Avenue | 10019

### INTERSECT

Mittels INTERSECT können Sie eine Schnittmenge erzeugen.

SELECT zip FROM hotel.customer WHERE zip < '30000'

INTERSECT

SELECT zip FROM hotel.hotel WHERE zip < '30000'

Anzeige der Postleitzahlen, die in beiden Tabellen verwendet werden.

Ergebnis

ZIP
20005

Ohne zusätzliche Angabe von ALL wird auch hier ein implizites DISTINCT durchgeführt.

### EXCEPT

Mittels EXCEPT können Sie Ergebnisse aus einer Ergebnistabelle von einer anderen abziehen. Dabei ist die Angabe der Reihenfolge der SELECT-Anweisungen wichtig.

SELECT zip FROM hotel.hotel WHERE zip < '30000'

EXCEPT

SELECT zip FROM hotel.customer WHERE zip < '30000'

Anzeige nur der Postleitzahlen aus der Hoteltabelle, die nicht in der Kundentabelle vorkommen.

Ergebnis

ZIP
12203
10019
20037
11788

Bevor das EXCEPT wirksam wird, wird implizit ein DISTINCT durchgeführt.

Möchten Sie erreichen, dass auch die Anzahl der in den einzelnen Ergebnistabellen gefundenen Zeilen in Betracht gezogen wird, verwenden Sie jeweils <UNION|INTERSECT|EXCEPT> ALL.

Siehe auch:

SQL-Referenzhandbuch, QUERY-Ausdruck (query_expression)

Weitere Beispiele zur Datenanfrage