- •Иерархическая, сетевая, реляционная модели представления данных.
- •Нормализация базы данных, основные принципы и цель нормализации.
- •Проектирование баз данных
- •Язык sql и его возможности, выборка данных средствами sql.
- •Язык sql и его возможности, редактирование данных средствами sql.
- •Создание, редактирование и удаление таблиц и связей средствами sql.
- •Вложенные и связанные подзапросы.
-
Вложенные и связанные подзапросы.
SQL позволяет вкладывать запросы друг в друга. Обычно внутрений запрос генерирует значения, которые тестируются на предмет истинности логического выражения.
Например, пусть известна фамилия преподавателя и требуется получить список его дипломников:
SELECT sname FROM СТУДЕНТ
WHERE spdp =
(SELECT pnum FROM ПРЕПОДАВАТЕЛЬ WHERE pname = "П-1");
В данном примере, чтобы выполнить основной (внешний) запрос, SQL сначала выполняет внутренний запрос (подзапрос) в предложении WHERE основного запроса. В результате этого будет получено pnum ="001" - код преподавателя с фамилией "П-1". Затем выполняется основной запрос с предложением WHERE spdp = "001", что позволяет получить результат
Существенно в данном случае, что подзапрос возвращает не более одного значения
Одним из видов функций, которые всегда выдают единственное значение для любого количества строк, являются агрегатные функции. Таким образом, единственность значения подзапроса гарантируется при использовании в нем единственной агрегатной функции без предложения GROUP BY.
Сгруппированные, то есть примененные с предложением GROUP BY, агрегатные функции могут дать в результате множество значений. Поэтому их нельзя применять в подзапросах.
Связанные подзапросы. Оператор EXISTS
Когда в SQL используются подзапросы, во внутреннем вложенном запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса, формируя тем самым связанный подзапрос.
Схема выполнения связанного подзапроса:
1) из таблицы внешнего запроса выбирается очередная строка-кандидат;
2) выполняется подзапрос, с использованием значений строки-кандидата;
3) оценивается условие внешнего запроса, по результатам чегострока-кандидат включается или нет в результат;
4) если не конец таблицы внешнего запроса, то переход к п.1.
При использовании вложенных подзапросов, в условных выражениях внешнего подзапроса могут использоваться служебные операторы EXISTS, ANY, ALL и SOME.
EXISTS - оператор, генерирующий значение "истина" или "ложь". Это значит, что его можно применять самостоятельно в условиях или комбинировать с логическими выражениями с помощью AND, OR и NOT. Используя подзапрос в качестве аргумента, этот оператор возвращает "истина", если результат подзапроса не пуст.
Выражение имя_поля операция_отношения ANY (подзапрос) считается истинным, если оно истинно для хотя бы одного значения результата подзапроса (... = какому-либо_из, ... < какого-либо_из и т.п.). Если подзапрос не генерирует выходных данных, то выражение с ANY принимает значение "ложь" независимо от операции отношения.
Выражение имя_поля операция_отношения ALL (подзапрос) считается истинным, если каждое значения результата подзапроса удовлетворяет условию (... <> всем, ... > всех и т.п.). Если подзапрос не генерирует выходных данных, то выражение с ALL принимает значение "истина" независимо от операции отношения.
Оператор ALL обычно не используется с операцией равенства, т.к. истина в этом случае возможна только если подзапрос возвращает только одинаковые значения, что в реальных базах данных маловероятно.