Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СУБД.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
6.32 Mб
Скачать

13.1.1 Проверка на существование (предикат exists)

В результате проверки на существование (предикат EXISTS) можно выяснить, содержится ли в таблице результатов подчиненного запроса хотя бы одна строка. Аналогичной простой проверки не существует. Проверка на существование допустима только в подчиненных запросах.

Если подчиненный запрос не возвращает ни одной строки, проверка EXISTS возвращает значение FALSE. Эта проверка не может возвращать NULL. Можно изменить логику проверки EXISTS и использовать форму NOT EXISTS.

Предикат EXISTS в действительности совсем не использует результаты подчиненного запроса. Проверяется только наличие результатов. По этой причине в SQL смягчается правило, согласно которому “подчиненный запрос должен возвращать один столбец данных”, и в подчиненном запросе проверки EXISTS допускается использование формы SELECT *. На практике при использовании подчиненного запроса в проверке EXISTS всегда применяется форма SELECT *

13.1.2 Многократное сравнение (предикаты any и all)

В проверке IN выясняется, не равно ли некоторое значение одному из значений, содержащихся в столбце результатов подчиненного запроса. В SQL имеются также две разновидности многократного сравнения – ANY и ALL, расширяющие предыдущую проверку до уровня других операторов сравнения, таких как больше (>) или меньше (<). В обеих проверках некоторое значение сравнивается со столбцом данных, отобранных подчиненным запросом.

Предикат any

В проверке ANY, для того чтобы сравнить проверяемое значение со столбцом данных, отобранных подчиненным запросом, используется один из шести операторов сравнения (=, !=, <, <=, >, >=). Проверяемое значение поочередно сравнивается с каждым элементом, содержащимся в столбце. Если любое из этих сравнений дает результат TRUE, то проверка ANY возвращает значение TRUE. Вот пример запроса с предикатом ANY:

Определить имя и номер телефона потенциальных арендаторов, чьи требования по арендной стоимости соответствуют предварительной арендной стоимости хотя бы одной из предлагаемых в аренду двухкомнатных квартир.

select fname, lname, tel_no

from renter

where max_rent >= any (select rent

from property_for_rent

where type = ‘f’ and rooms=2);

Предикат all

В проверке ALL, как и в проверке ANY, используется один из шести операторов сравнения проверяемого значения со столбцом данных, отобранных подчиненным запросом. Проверяемое значение поочередно сравнивается с каждым элементом, содержащимся в столбце. Если все сравнения дают результат TRUE, то проверка ALL возвращает значение TRUE. Вот пример запроса с предикатом ALL:

Определить имя и номер телефона потенциальных арендаторов, чьи требования по арендной стоимости соответствуют предварительной арендной стоимости любого из предлагаемых в аренду объектов недвижимости типа двухкомнатная квартира.

select fname, lname, tel_no

from renter

where max_rent >= all (select rent

from property_for_rent

where type = ‘f’ and rooms=2);

13.1.3 Уровни вложенности запросов

Все рассмотренные до сих пор запросы были "двухуровневыми" и состояли из главного и подчиненного запросов. Точно так же, как внутри главного запроса может находиться подчиненный запрос, внутри подчиненного запроса может находиться еще один подчиненный запрос, называемый в таком случае вложенным. Вот пример "трехуровневого" запроса:

Составить перечень сдаваемых в аренду объектов, за которые отвечают работники отделения компании, расположенного по адресу…

select street, area, city, type, rooms, rent

from property_for_rent in (select sno

from staff

where bno =(select bno

from branch

where street = '…'));

По такой же методике можно создавать запросы с четырьмя и более уровнями вложенности. Стандарт ANSI/ISO не определяет максимальное число уровней вложенности, но на практике с ростом их числа очень быстро увеличивается время выполнения запроса. Когда запрос имеет более двух уровней вложенности, он становится трудным для чтения и понимания. Во многих СУБД количество уровней вложенности запросов ограничено относительно небольшим числом.