Es gibt eine Reihe von Möglichkeiten, Ergebnisse aus mehreren Ergebnistabellen miteinander in Beziehung zu setzen und daraus eine neue Ergebnistabelle zu erzeugen.
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.
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.customer 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 |
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.
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