Базы данных - модели, разработка, реализация



         

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


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

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

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

  • FROM R1 AS A. R1 AS В
  • или

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

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

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

  • SELECT ФИО
  • FROM R1 as a
  • WHERE Оценка > 2
  • GROUP BY ФИО
  • HAVING COUNT(*) = (SELECT COUNT(*)
  • 87

  • FROM R2.R3
  • WHERE R2.rpynna=R3.Группа AND ФИО=а.ФИО)
  • Здесь во встроенном запросе определяется общее число экзаменов, которые должен сдавать каждый студент, обучающийся в группе, в которой учится данный студент, и это число сравнивается с числом экзаменов, которые сдал данный студент.

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

  • SELECT ФИО
  • FROM R2 a. R3
  • WHERE R2.Группа = R3.Группа AND Дисциплина = "БД" AND NOT EXISTS (SELECT ФИО
  • FROM R1
  • WHERE ФИО=а.ФИО AND Дисциплина - "БД")
  • Предикат EXISTS ( SubQuery) истинен, когда подзапрос SubQuery не пуст, то есть содержит хотя бы один кортеж, в противном случае предикат EXISTS ложен.




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