Вложенные подзапросы
SQL позволяет использовать одни запросы внутри других запросов, то есть вкладывать запросы друг в друга. Предположим, известна фамилия студента («Петров»), но неизвестно значение поля STUDENT ID для него. Чтобы извлечь данные обо всех оценках этого студента, можно записать следующий запрос:
SELECT *
FROM EXAM_MARKS WHERE STUDENT_ID =
(SELECT STUDENT_ID FROM STUDENT SURNAME = 'Петров');
Как работает запрос SQL со связанным подзапросом?
Выбирается строка из таблицы, имя которой указано во внешнем запросе.
Выполняется подзапрос и полученное значение применяется для анализа этой строки в условии предложения WHERE внешнего запроса.
По результату оценки этого условия принимается решение о включении или не включении строки в состав выходных данных.
• Процедура повторяется для следующей строки таблицы
внешнего запроса.
Следует обратить внимание, что приведенный выше запрос корректен только в том случае, если в результате выполнения указанного в скобках подзапроса возвращается единст венное значение. Если в результате выполнения подзапроса будет возвращено несколько значений, то этот подзапрос будет ошибочным. В данном примере это произойдет, если в таблице STUDENT будет несколько записей со значениями поля SURNAME = 'Петров'.
В некоторых случаях для гарантии получения единственного значения в результате выполнения подзапроса используется DISTINCT. Одним из видов функций, которые автоматически всегда выдают в результате единственное значение для любого количества строк, являются агрегирующие функции.
Оператор IN также широко применяется в подзапросах. Он задает список значений, с которыми сравниваются другие значения для определения истинности задаваемого этим оператором предиката.
Данные обо всех оценках (таблица EXAM_MARKS) студентов из Воронежа можно выбрать с помощью следующего запроса:
SELECT *
FROM EXAM_MARKS WHERE STUDENT_ID IN
(SELECT STUDENT_ID FROM STUDENT WHERE CITY = 'Воронеж');
Подзапросы можно применять внутри предложения HAVING. Пусть требуется определить количество предметов обучения с оценкой, превышающей среднее значение оценки студента с идентификатором 301:
SELECT COONT(DISTINCT SUBJ_IDj , MARK
FROM EXAM_MARKS GROUP BY MARK HAVING MARK >
(SELECT AVG(MARK) FROM EXAM_MARKS WHERE STUDENT_ID = 301) ;
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ; |