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