## Joins: Informationen aus mehreren Tabellen

Zur Beantwortung mancher Anfragen müssen mehrere Tabellen durchsucht werden. Die Verbindung zwischen diesen Tabellen wird über Spalten hergestellt, die in mehreren Tabellen erscheinen. Eine solche Anweisung wird als Join bezeichnet.

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

### Beispiele

SELECT reservation.rno, customer.name, reservation.arrival, reservation.departure
FROM hotel.customer, hotel.reservation
WHERE customer.name = 'Porter'
AND customer.cno = reservation.cno

Anzeige, ob und wann für den Kunden Porter eine Buchung vorliegt.

Ergebnis

RNO | NAME | ARRIVAL | DEPARTURE
100 | Porter | 2004-11-13 | 2004-11-15
110 | Porter | 2004-12-24 | 2005-01-06

Die Verknüpfung der beiden Tabellen erfolgt über die Kundennummer, d.h. es werden nur die Zeilen ausgewählt, die den Name Porter enthalten und für die die Kundennummern übereinstimmen. Als Operatoren in der WHERE-Klausel sind =, <, <=, >, >= und <> möglich.

Die Gesamtergebniszeile wird aus den gewünschten Spalten der jeweiligen Tabelle zusammengesetzt. Wenn Spalten in zwei verschiedenen Tabellen denselben Namen haben, muss in der Anweisung vor dem Spaltennamen der Tabellenname angegeben werden, wobei beide durch einen Punkt verbunden werden.

SELECT customer.name, reservation.rno, hotel.name hotel_name
FROM hotel.customer, hotel.reservation, hotel.hotel
WHERE customer.name = 'Porter'
AND customer.cno=reservation.cno
AND reservation.hno = hotel.hno

Anzeige aller Hotels, die der Kunder Porter gebucht hat. Dazu müssen die Tabellen customer, reservation und hotel verkettet werden.

Ergebnis

NAME | RNO | HOTEL_NAME
Porter | 100 | Midtown
Porter | 110 | Beach

### Outer-Join

Zunächst noch einmal ein Join-Beispiel:

SELECT hotel.name hotel_name, city.zip, city.name city_name
FROM hotel.hotel, hotel.city
WHERE city.state = 'CA' AND city.zip=hotel.zip

Anzeige der Städte des Staates CA, für die Hotels in der Hoteltabelle angegeben sind

Ergebnis

HOTEL_NAME | ZIP | CITY_NAME
Long Beach | 90804 | Long Beach
Star | 90029 | Hollywood
Indian Horse | 92262 | Palm Springs

Wenn Sie jetzt alle Städtenamen angezeigt bekommen wollen, unabhängig davon ob für diese Stadt ein Hotel angegeben ist, so können Sie einen Outer-Join verwenden.

Ein Outer-Join wird durch den Operator (+) gekennzeichnet.

SELECT hotel.name hotel_name, city.zip, city.name city_name
FROM hotel.hotel, hotel.city
WHERE city.state = 'CA' AND city.zip=hotel.zip (+)

Anzeige der Städte des Staates CA, für die Hotels in der Hoteltabelle angegeben sind

Ergebnis

HOTEL_NAME | ZIP | CITY_NAME
Long Beach | 90804 | Long Beach
Star | 90029 | Hollywood
Indian Horse | 92262 | Palm Springs
? | 90018 | Los Angeles
? | 92714 | Irvine
? | 95054 | Santa Clara

Es wird eine Liste aller Städte des Staates CA angezeigt. Für die Städte, für die es keine Hoteleinträge gibt, wird der Hotelname mit einem NULL-Wert belegt.

Siehe auch:

SQL-Referenzhandbuch, JOIN-Prädikat (join_predicate)

Weitere Beispiele zur Datenanfrage