Subquery: Internal Queries

A second SELECT statement (Subquery (subquery)) can be included in a SELECT statement. A value or set of values is generated by the subquery as part of the main statement.

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 name, zip
  FROM hotel.customer
    WHERE zip = (SELECT MAX(zip) FROM hotel.customer)

Displaying the customer with the greatest zip code

Result

NAME

ZIP

Doe

97213

See also:

SQL Reference Manual, Comparison Predicate (comparison_predicate)

SELECT hno, name, zip
  FROM hotel.hotel
    WHERE zip IN(SELECT zip FROM hotel.customer WHERE title = 'Mrs')

Displaying the hotels located in cities/places in which female customers also live

Result

HNO

NAME

ZIP

10

Congress

20005

See also:

SQL Reference Manual, IN Predicate (in_predicate)

SELECT hno, name
  FROM hotel.hotel
    WHERE name = ANY(SELECT name FROM hotel.city)

Displaying hotels that have the same name as other cities in the city table. The inner query determines the list of city names with which the hotel names are compared.

Result

HNO

NAME

20

Long Island

120

Long Beach

SELECT cno, name
  FROM hotel.customer
    WHERE cno = ANY(SELECT cno FROM hotel.reservation WHERE arrival > '2005-01-01')

Displaying the customers that have made all reservations as of a specified date

Result

CNO

NAME

3600

Smith

3900

Howe

Use ANY if the subquery returns more than one value and you want to take this into consideration in the WHERE clause condition that usually requires exactly one value.

See also:

SQL Reference Manual, Quantified Predicate (quantified_predicate)

Correlated Subquery

You can use correlated subqueries to formulate conditions for selecting rows; these conditions are to apply to groups of rows only and not to all rows in a table.

Whereas subqueries are evaluated once only, correlated subqueries are evaluated for each row in the external table, from the inside out, in the case of compound subqueries.

SELECT hno, type, price
  FROM hotel.room room_table
    WHERE price =
    (SELECT MAX(price) FROM hotel.room WHERE type = room_table.type)

Displaying the hotels (in the form of the hotel number) whose rooms in the individual types (single, double, or suite) have the highest price

Since in this example, the same table is addressed in the external SELECT statement as in the subquery, you have to specify a reference name (room_table). A row from the result of the external SELECT statement is linked (correlated) to a value in the subquery.

Explanation

?     SELECT hno, type, price FROM hotel.room room_table
Searches for the hotel number, room type and price in the 
room table and renames the table room_table .

?     WHERE price=
Contains the row in which the price is the same as the result of the following subquery:

?     (SELECT MAX(price) FROM hotel.room
(Start the subquery) searches for the maximum price in the
room table

?     WHERE type = room_table.type)
the room types here are to be the same as the room types in the rows found above

Result

HNO

TYPE

PRICE

130

double

270

130

single

160

130

suite

700

SELECT cno, title, name FROM hotel.customer
  WHERE EXISTS
    (SELECT * FROM hotel.reservation
        WHERE hotel.customer.cno = hotel.reservation.cno)

Displaying only those customers from the customer table for which one or more reservations exist

Result

CNO

TITLE

NAME

3000

Mrs

Porter

3100

Mr

Brown

3200

Company

Datasoft

3600

Mrs

Smith

3900

Mr

Howe

4100

Mrs

Baker

4300

Company

TOOLware

4400

Mr

Jenkins

Use EXISTS if you only want the subquery to find out whether a row exists that fulfils a specific condition.

See also:

SQL Reference Manual, EXISTS Predicate (exists_predicate)

More examples for Data Query