## Joins: Information from Several Tables

In order to respond to some queries, the system must search several tables. The link between these tables is established on the basis of columns that appear in several tables. Statements such as this are called a “join.”

### Prerequisites

You require the demo data for the SQL Tutorial.

Start the query tool SQL Studio as database administrator MONA with password RED and log on to the demo database instance DEMODB.

### Examples

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

Displaying whether and when a reservation was made for the customer “Porter”

Result

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

The link between the two tables is established on the basis of the customer number, that is, only those rows that contain the name “Porter” and in which the customer numbers are identical are selected. =, <, <=, >, >=, and <> are possible operators in the WHERE clause.

The overall result row comprises the desired columns in the relevant table. If columns in two different tables have the same name, the table name must be specified in the statement before the column name; the two names are then linked by a period (.).

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

Displaying all the hotels in which the customer “Porter” has made a reservation. For this purpose, the customer, reservation, and hotel tables must be concatenated.

Result

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

### Outer Join

First, here is another example of a join:

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

Displaying the cities in the state of CA for which hotels are specified in the hotel table

Result

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

If you now want to display all city names, regardless of whether or not a hotel is specified for these individual cities, you can use an outer join.

An outer join is represented by the operator (+).

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 (+)

Displaying the cities in the state of CA for which hotels are specified in the hotel table

Result

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

A list of all the cities in the state of CA is displayed. For those cities for which no hotel entries exist, the system assigns the hotel name a NULL value.

See also:

SQL Reference Manual, JOIN Predicate (join_predicate)

More examples for Data Query