Одни запросы могут быть размещены внутри других запросов. Обычно подчиненный запрос генерирует значение, которое проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.
Часто бывает необходимо сравнивать значения в определенных столбцах со списком значений этого же столбца из другой таблицы или запроса. В подобных случаях используется ключевое слово IN (NOT IN).
Например, вывести список сотрудников, за которыми не закреплен ни один из объектов недвижимости.
SELECT *
WHERE Staff_no NOT IN (SELECT Staff_no FROM PROPERTY);
В подзапросах допускается использование агрегатных функций, например, для вывода списка трехкомнатных квартир, цена которых превышает среднюю цену трехкомнатной квартиры, используется запрос:
WHERE Rooms=3
AND Selling_Price >(SELECT AVG(Selling_Price) FROM Property
WHERE Rooms=3);
Вывести список владельцев собственности, чьи объекты были осмотрены в определенный день:
ON PROPERTY.Owner_no=OWNER.Owner_no
WHERE PROPERTY.Property_no=(SELECT Property_no
WHERE Date_View=’18.01.03’);
В таблице VIEWING будет найдена соответствующая дата и передана в предложение WHERE. После определения даты в основном запросе из таблицы PROPERTY будут отобраны записи, удовлетворяющие заданному условию.
(В данном примере предполагается, что подзапрос должен вернуть только одно значение).
Если подчиненный запрос возвращает более одного значения, использование запроса в таком виде приведет к ошибке. В тех случаях, когда подчиненный запрос возвращает более одной строки необходимо использовать следующие ключевые слова: ANY, SOME, ALL. Подчиненный запрос в этом случае должен возвращать один столбец.
ANY или SOME – возвращает TRUE, если заданное выражение является истинным для какой-нибудь из строк возвращаемой запросом.
ALL - возвращает TRUE, если заданное выражение является истинным для всех строк возвращаемой запросом.
Выведите список объектов собственности, которые были осмотрены покупателями (присутствуют в таблице VIEWING):