Теория баз данных

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


Теперь вернемся к БД «Сессия» и рассмотрим на ее примере использование вложенных запросов.

С помощью SQL можно вкладывать запросы внутрь друг друга. Обычно внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего, верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.

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

FROM Rl AS A, Rl AS В

ИЛИ

FROM Rl A. Rl В:

оба выражения эквивалентны и рассматриваются как применения оператора SELECT к двум экземплярам таблицы R1.

Например, покажем, как выглядят на SQL некоторые запросы к БД «Сессия»:

  • Список тех, кто сдал все положенные экзамены.

    SELECT ФИО

    FROM Rl as a

    WHERE Оценка > 2

    GROUP BY ФИО

    HAVING COUNT(*) = (SELECT COUNT(*)

    FROM R2.R3

    WHERE R2.Группа=R3.Группа AND ФИОа.ФИО)

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

  • Список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал.

    SЕLЕСТ ФИО

    FROM R2 a, R3

    WHERE R2.Fpynna=R3.Группа AND Дисциплина = "БД" AND NOT EXISTS

    (SELECT ФИО FROM Rl WHERE ФИО=а.ФИО AND Дисциплина = "БД")

    Предикат EXISTS ( SubQuery) истинен, когда подзапрос SubQuery не пуст, то есть содержит хотя бы один кортеж, в противном случае предикат EXISTS ложен.

    Содержание  Назад  Вперед