- •Лабораторных работ
- •Основные термины
- •Синтаксис команды select
- •Создание таблиц
- •4. Команды манипулирования данными
- •4.1 Вставка в таблицу новой строки
- •4.2 Удаление строк из таблицы
- •4.3 Команда update
- •Формирование запросов (команда select).
- •5.1 Выбор по критерию
- •5.2 Исключение дублирующих значений.
- •5.3 Операторы в сравнениях
- •5.3.1 Операторы сравнения.
- •5.3.2 Булевы операторы
- •5.3.3 Специальные операторы в условиях.
- •5.4 Подведение итогов с помощью функций агрегирования
- •5.5 Упорядочение выходных полей
- •Соединение таблиц
- •Объединение таблицы по принципу «сама с собой»
- •7.1 Вложение запросов
- •7.2 Использование агрегатных функций в подзапросе
- •7.3 Связанные подзапросы в having
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. ДАТА);
Подзапрос вычисляет количество строк с одной и той же датой, совпадающей с датой, для которой сформирована очередная группа основного запроса.