Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методическое пособие Л.Р(SQL).doc
Скачиваний:
19
Добавлен:
21.11.2019
Размер:
159.23 Кб
Скачать

7.1 Вложение запросов

Один запрос может быть вложен в другой запрос. Запрос, который вкладывается, - это подзапрос, а в которой вкладывается- основной (внешний). Подзапрос записывается в предложении WHERE, выполняется первым по отношению к внешнему, и используется для определения истинности или ложности предиката.

Пример. Уточнить размер стипендии студента Сапега:

SELECT*

FROM Stip=

(SELECT Stip

FROM Spisok

WHERE Fio=’Сапега’);

Выполнение запроса начинается с подзапроса: просматриваются все записи таблицы Spisok и выбираются все записи, для которых значение поля Fio равно «Сапега»; для этих записей выбирается значение для поля Stip, выбранное значение подставляется в предикат основного запроса в предложение WHERE вместо самого подзапроса (предложение будет иметь вид: WHERE Stip=9005). Подзапрос возвращает одно и только одно значение. Необходимо быть уверенным, что подзапрос выдает только одну строку. Далее выполняется основной запрос.

Для гарантии того, что результатом подзапроса является единственное значение (строка), рекомендуется использовать аргумент DISTINCT:

( SELECT DISTINCT Stip…)

7.2 Использование агрегатных функций в подзапросе

Агрегатные функции (COUNT, SUM,AVG,MAX,MIN) автоматически выдают единственное значение для любого количества строк, которое используется в предикате.

Пример .Выбрать фамилии студентов, стипендия которых меньше средней на курсе:

SELECT*

FROM Spisok

WHERE Stip<

( SELECT AVG (Stip)

FROM Spisok

WHERE kurs=1);

В подзапросах можно использовать оператор IN в предложении WHERE или HAWING внешнего запроса.

Подзапросы могут быть вложены в предложения SELECT, UPDATE, DELETE, INSERT.

Оператор EXISTS проверяет только наличие в таблице результатов вложенного запроса хотя бы одной строки. Он используется для образования предиката, который фиксирует, будет ли подзапрос генерировать выходные данные. Оператор EXISTS генерирует значение “истина” или “ложь”. Его можно применять в комбинации с операторами AND, OR, NOT. В операторе EXISTS подзапрос используется в качестве аргумента; подзапрос не может принимать значение «неизвестно».

Пример. Вывести с таблицы Spisok список академических групп, если ни один студент не получает повышенной стипендии (>200 000).

SELECT kurs,grupa

FROM Spisok

WHERE EXISTS

(SELECT*

FROM Spisok

WHERE Stip>200 000);

Оператор EXISTS фиксирует наличие выходных данных подзапроса.

Главный запрос последовательно просматривает все строки таблицы Spisok, и для каждой академической группы выполняется вложенный запрос. Результатом вложенного запроса является столбец данных, содержащий названия академических , групп и студентов, получающих стипендию, превышающую 200 000 руб.

7.3 Связанные подзапросы в having

Предложение GROUP BY позволяет группировать выводимые SELECT-запросом записи по значению некоторого поля. Использование предложения HAVING позволяет при выводе осуществлять фильтрацию таких групп. Предикат предложения HAVING оценивается не для каждой строки результата, а для каждой группы выходных записей, сформированной предложением GROUP BY внешнего запроса.

Пусть, например, необходимо по данным из таблицы ОЦЕНКИ определить сумму полученных студентами оценок (значений поля ОЦЕНКА), сгруппировав значения оценок по датам экзаменов и исключив те дни, когда число студентов, сдававших в течении дня экзамены, было меньше 10.

SELECT ДАТА, SUM (ОЦЕНКА)

FROM ОЦЕНКИ A

GROUP BY ДАТА

HAVING 10 <

(SELECT COUNT (ОЦЕНКА)

FROM ОЦЕНКИ B

WHERE A. ДАТА = B. ДАТА);

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

16