2.10.   Связанные подзапросы в HAVING

В разделе 2.4 указывалось, что предложение GROUP BY позво­ляет группировать выводимые SELECT-запросом записи по зна­чению некоторого поля. Использование предложения HAVING

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

Пусть, например, необходимо по данным из таблицы EXAM_MARKS определить сумму полученных студентами оценок (значений поля MARK), сгруппировав значения оценок по датам экзаменов и исключив те дни, когда число студентов, сдавав­ших в течение дня экзамены, было меньше 10.

SELECT EXAM_DATE,   SUM (MARK) FROM EXAM_MARKS A GROUP BY EXAM_DATE HAVING   10 <

(SELECT COUNT (MARK) FROM EXAM_MARKS В

WHERE A. EXAM_DATE = B.EXAM_DATE) ;

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

Упражнения

1. Напишите запрос с подзапросом для получения данных обо всех

оценках студента с фамилией «Иванов». Предположим, что его персональный номер неизвестен. Всегда ли такой запрос будет корректным?

2. Напишите запрос, выбирающий данные об именах всех студентов, имеющих по предмету с идентификатором 101 балл выше общего среднего балла.

3. Напишите запрос, который выполняет выборку имен всех студен­тов, имеющих по предмету с идентификатором 102 балл ниже об щего среднего балла

4. Напишите запрос, выполняющий вывод количества предметов, по которым экзаменовался каждый студент, сдававший более 20 пред­метов.

5. Напишите команду SELECT, использующую связанные подзапро­сы и выполняющую вывод имен и идентификаторов студентов,у которых стипендия совпадает с максимальным значением сти­пендии для города, в котором живет студент.

6. Напишите запрос, который позволяет вывести имена и идентифи­каторы всех студентов, для которых точно известно, что они про живают в городе, где нет ни одного университета.

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