Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_KL_2010_14.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
28.97 Mб
Скачать

4.4.1.Определение подчиненных запросов

Вложенные запросы всегда входят в предложение WHERE или HAVING и заключаются в круглые скобки. В предложении WHERE они отбирают из таблицы отдельные строки, а в предложении HAVING  группы строк. Подчиненные запросы имеют ту же структуру, что и инструкция SELECT, содержащая предложение FROM и необязательные предложения WHERE, GROUP BY и HAVING. Однако между вложенным запросом и инструкцией SELECT имеются отличия:

  • таблица результатов вложенного запроса всегда состоит из одного столбца, поэтому в предложении SELECT вложенного запроса всегда следует указывать только один возвращаемый столбец;

  • во вложенный запрос не может входить предложение ORDER BY, так как результаты вложенного запроса используются только внутри главного запроса и для пользователя остаются невидимыми. Поэтому нет смысла их сортировать.

Чаще всего вложенные запросы используются в предложении WHERE и участвуют в процессе отбора строк. В простейшем случае вложенный запрос возвращает значение, позволяющее проверить истинность или ложность условия отбора.

Рассмотрим следующий пример: вывести список служащих, чей плановый объем продаж составляет менее 10% от планового объема продаж всей компании.

SELECT NAME

FROM SLUZHASCHIE

WHERE QUOTA < (0.1 * (SELECT SUM(TARGET)

FROM OFFISY))

В приведенном запросе вложенный запрос вычисляет одну и ту же сумму плановых объемов продаж всех офисов, которая затем умножается на 0,1 (10%). Полученное значение используется в условии отбора при сканировании таблицы SLUZHASCHIE на предмет поиска нужных строк.

Далее рассмотрим более сложный пример, приведенный в предыдущем разделе

SELECT CITY

FROM OFFISY

WHERE TARGET > (SELECT SUM(QUOTA)

FROM SLUZHASCHIE

WHERE SLUZHASCHIE.ID_OFC = OFFISY.ID_OFC)

Рис. 1.1. Выполнение вложенного запроса в предложении WHERE

На Рис. 1.1. приведена схема выполнения этого запроса, в котором вложенный запрос возвращает различные результаты для каждого офиса.

1. Главный запрос извлекает данные из таблицы OFFISY.

2. Условие предложения WHERE обеспечивает отбор офисов, включаемых в таблицу результатов запроса. Это условие поочередно применяется ко всем строкам таблицы OFFISY.

3. В предложении WHERE сравнивается значение текущей строки в столбце TARGET со значением, возвращаемым вложенным запросом.

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

5. Результатом выполнения вложенного запроса является одно число, и предложение WHERE сравнивает его значение со значением столбца TARGET, выбирая или отбрасывая текущий офис на основании результата сравнения.

4.4.2.Условия отбора в подчиненном запросе

Вложенный запрос всегда является частью условия отбора в предложении WHERE и HAVING. В SQL используются следующие условия отбора вложенного во вложенном запросе:

  • сравнение с результатом подчиненного запроса: значение выражения сравнивается с одним значением, вычисленным вложенным запросом. Эта проверка представляет собой простое сравнение;

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

  • проверка на существование: проверяется наличие строк в таблице результатов вложенного запроса;

  • многократное сравнение: значение выражения сравнивается с каждым из множества значений, возвращаемых вложенным запросом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]