Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД вопросы 16-29.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
169.14 Кб
Скачать

21. Понятие подзапроса. Примеры формирования связанных и вложенных подзапросов.

Подзапрос – это инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором. Текст подзапроса должен быть заключен в скобки.

Запросы, отделенные круглыми скобками и входящие в состав конструкций HAVING, WHERE, FROM, SELECT и WITH внешнего запроса SELECT или каких-либо других перечисленных запросов, заключающих в себе эти конструкции, называются вложенными запросами (подзапросами).

Вложенные подзапросы могут быть простыми и связанными. Если результат вложенного запроса не зависит от результата внешнего, то такой вложенный запрос называется простым.

Вложенные подзапросы:

Предположим, та фамилия студента («Петров»), но неизвестно значение поля STUDENT_ID для него. Чтобы извлечь данные обо всех оценках этого студента, можно записать следующий запрос:

SELECT *

FROM EXAM_MARKS

WHERE STUDENT_ID =

(SELECT STUDENT_ID

FROMSTUDENTSURNAME='Петров');

Как работает запрос SQL со связанным подзапросом?

  1. Выбирается строка из таблицы, имя которой указано во внешнем запросе.

  2. Выполняется подзапрос и полученное значение применяется для анализа этой строки в условии предложения WHERE внешнего запроса.

  3. По результату оценки этого условия принимается решение о включении или не включении строки в состав выходных данных.

  4. Процедура повторяется для следующей строки таблицы внешнего запроса.

В некоторых случаях для гарантии получения единственного значения в результате выполнения подзапроса используется DISTINCT.

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

Пусть требуется определить количество предметов обучения с оценкой, превышающей среднее значение оценки студента с идентификатором 301:

SELECT COUNT (DISTINCT SUBJ_ID), MARK

FROM EXAM_MARKS

GROUP BY MARK

HAVING MARK>

(SELECT AVG(MARK)

FROM EXAM_MARKS

WHERESTUDENT_ID = 301);

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

Если результат вложенного запроса зависит от результата внешнего, то такой вложенный запрос называется связанным вложенным запросом. Иными словами, вложенный запрос является связанным, если в конструкциях WHERE, HAVING указан столбе, фигурирующий во внешнем запросе. Такая связь имеет название внешней ссылки. В связанных вложенных запросах названия столбцов записываются полностью. Если во внешней конструкции запроса и вложенной используется общая таблица, то столбцам присваиваются псевдонимы.

При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса. В этом случае такой связанный подзапрос выполняется по одному разу для каждой строки таблицы основного запроса.

Пример: выбрать сведения обо всех предметах обучения, по которым проводился экзамен 20 января 2006 г.

SELECT *

FROM SUBJECT SU

WHERE '20/01/2006' IN

(SELECT EXAM_DATE

FROM EXAM_MARKS EX

WHERE SU.SUBJ_ID=EX.SUBJ_ID);