
- •16. Язык sql (Structured Query Language). Интерактивный и встроенный sql. Составные части sql. Типы данных sql. Основные типы команд sql
- •17. Основные отличия sql от процедурных языков программирования. Встроенные функции
- •18. Язык sql. Команды манипулирования данными
- •19. Архитектуры приложений. Основные различия между архитектурами приложений.
- •21. Понятие подзапроса. Примеры формирования связанных и вложенных подзапросов.
- •22. Понятие хранимой процедуры. Особенности и синтаксис построения хранимых процедур на языке TransactSql.
- •23. Определение пользовательской функции. Основное отличие пользовательских функций от хранимых процедур. Основное отличие скалярной пользовательской функции от табличной.
- •24.Понятие триггера. Особенности и синтаксис построения триггера на языке TransactSql.
- •25.Современные направления исследований и разработок в области баз данных. Системы управления базами данных следующего поколения.
- •26.Реализация системы защиты данных в субд.
- •27.Информационные приложения, основанные на использовании "складов данных" (DataWarehousing). Oltp и olap приложения. Описание типа хранилища данных под названием «снежинка», «звезда».
- •28.Объектно-реляционные субд. Подходы к построению объектно-реляционных субд (орсубд). К лассификация субд
- •29.Объектно-ориентированные субд. Особенности построения моделей суобд.
21. Понятие подзапроса. Примеры формирования связанных и вложенных подзапросов.
Подзапрос – это инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором. Текст подзапроса должен быть заключен в скобки.
Запросы, отделенные круглыми скобками и входящие в состав конструкций HAVING, WHERE, FROM, SELECT и WITH внешнего запроса SELECT или каких-либо других перечисленных запросов, заключающих в себе эти конструкции, называются вложенными запросами (подзапросами).
Вложенные подзапросы могут быть простыми и связанными. Если результат вложенного запроса не зависит от результата внешнего, то такой вложенный запрос называется простым.
Вложенные подзапросы:
Предположим, та фамилия студента («Петров»), но неизвестно значение поля STUDENT_ID для него. Чтобы извлечь данные обо всех оценках этого студента, можно записать следующий запрос:
SELECT *
FROM EXAM_MARKS
WHERE STUDENT_ID =
(SELECT STUDENT_ID
FROMSTUDENTSURNAME='Петров');
Как работает запрос SQL со связанным подзапросом?
Выбирается строка из таблицы, имя которой указано во внешнем запросе.
Выполняется подзапрос и полученное значение применяется для анализа этой строки в условии предложения WHERE внешнего запроса.
По результату оценки этого условия принимается решение о включении или не включении строки в состав выходных данных.
Процедура повторяется для следующей строки таблицы внешнего запроса.
В некоторых случаях для гарантии получения единственного значения в результате выполнения подзапроса используется 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);