Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
samples / Zaochniki / Базы и банки.doc
Скачиваний:
26
Добавлен:
25.03.2015
Размер:
98.82 Кб
Скачать
  1. Вложенные и связанные подзапросы.

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 обычно не используется с операцией равенства, т.к. истина в этом случае возможна только если подзапрос возвращает только одинаковые значения, что в реальных базах данных маловероятно.

Соседние файлы в папке Zaochniki