Anfang des Inhaltsbereichs

Diese Grafik wird im zugehörigen Text erklärt Mengenoperationen: UNION, INTERSECT, EXCEPT Dokument im Navigationsbaum lokalisieren

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.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

 

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, StrukturlinkQUERY-Ausdruck (query_expression)

Weitere Beispiele zur Datenanfrage

Ende des Inhaltsbereichs