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

4.4.3.Подчиненные запросы в предложении having

Вложенные запросы могут использоваться также в предложении HAVING, когда требуется отобрать группу строк. Рассмотрим следующий пример, содержащий вложенный запрос в предложении HAVING. Вывести список служащих, у которых средняя стоимость заказов на товары, изготовленные компанией ВАЗ, выше, чем общая средняя стоимость заказов.

SELECT FAMILY, NAME, AVG(PRICE_ALL)

FROM SLUZHASCHIE S, ZAKAZY Z

WHERE S.ID_SLZH = Z.ID_SLZH AND Z.ID_MFR = `ВАЗ`

GROUP BY FAMILY, S.ID_SLZH

HAVING AVG(PRICE_ALL) >= (SELECT AVG(PRICE_ALL)

FROM ZAKAZY Z WHERE S.ID_SLZH = Z.ID_SLZH))

FAMILY

NAME

AVG(PRICE_ALL)

Ганин

Сергей

Петров

Петр

Нилов

Лев

Алгоритм выполнения запроса

1. Вложенный запрос вычисляет среднюю стоимость по всем заказам.

2. Этот простой вложенный запрос вычисляет среднюю стоимость один раз, а затем многократно используется в предложении HAVING.

3. Главный запрос просматривает строки таблицы ZAKAZY, отыскивая все заказы на товары компании ВАЗ, и группирует их по именам служащих.

4. Предложение HAVING сравнивает среднюю стоимость по каждой группе товаров со средней стоимостью по всем заказам, вычисленной ранее.

5. Если средняя стоимость по группе больше, чем общая средняя стоимость, то данная группа строк сохраняется, если нет, то данная группа строк исключается.

6. Предложение SELECT создает для каждой группы итоговую строку, содержащую фамилию, имя и среднюю стоимость принятых ими заказов.

Описанный алгоритм выполнения запроса приведен на 4.4.4Рис. 1.1. .

4.4.4.Правила выполнения вложенных запросов

А теперь подведем итоги изучения вложенных запросов и сформулируем правила, позволяющие использовать результаты одного запроса для получения результатов другого.

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

1. Если вложенный запрос содержится в предложении WHERE, его результаты используются для отбора отдельных строк, данные из которых заносятся в таблицу результатов запроса.

2. Если вложенный запрос содержится в предложении HAVING, его результаты используются для отбора групп строк, данные из которых заносятся в таблицу результатов запроса.

3. Вложенные запросы могут иметь несколько уровней вложенности.

4. При сравнении с результатом вложенного запроса проверяемое значение сравнивается с единственным значением, которое возвращается вложенным запросом.

5. При проверке на принадлежность результатам вложенного с помощью предиката IN значение выражения проверяется на равенство одному из множеств значений, которые возвращаются вложенным запросом.

6. При проверке на существование с помощью предиката EXISTS выясняется, возвращает ли вложенный запрос какие-либо значения.

7. При многократном сравнении с помощью предикатов ANY и ALL значение выражения сравнивается со всеми значениями, отобранными подчиненным запросом, чтобы выяснить, выполняется ли условие сравнения для некоторых, либо для всех значений.

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