ВУЗ:
Составители:
Рубрика:
37
Квантор существования в подзапросах
В реляционном исчислении квантор существования был введен для
операции соединения. Как мы уже убедились, SQL позволяет производить
соединения таблиц несколькими более удобными способами. Однако есть
ряд запросов, в которых использование квантора всеобщности кажется есте-
ственным. Эти запросы обычно содержат отрицания. Большинство из них
имеет эквивалентное решение с помощью оператора IN. Рассмотрим сле-
дующий запрос.
Запрос 4: Определить номера студентов, которые не сдавали курс К3.
Решение – НЕ РЕШЕНИЕ:
SELECT DISTINCT ID_Stud
FROM УСПЕВАЕМОСТЬ
WHERE ID_Subj<> ‘К3’
Нетрудно понять, что результатом этого запроса будут все студенты,
сдававшие любые курсы наряду с курсом К3. Более того, в ответ не войдет
Петров П.П., который вообще ничего не сдавал, следовательно, удовлетворя-
ет условию задачи.
Переформулируем запрос.
Запрос 4-1: Определить номера студентов, для которых НЕ
СУЩЕСТВУЕТ записи в таблице УСПЕВАЕМОСТЬ о сдаче курса К3.
Такая формулировка естественным образом вводит квантор существо-
вания [NOT] EXIST (SubQuery). В этом случае результат подзапроса
(SubQuery) – множество картежей. Если это множество не пусто, то значение
предиката EXISTS становится TRUE, а предиката NOT EXISTS – FALSE, и
наоборот, если результат подзапроса – пустое множество.
Решение:
SELECT СТ1.ID_Stud FROM СТУДЕНТ AS СТ1
WHERE NOT EXISTS (SELECT * FROM УСПЕВАЕМОСТЬ AS У1
WHERE СТ1.ID_Stud=У1.ID_Stud
AND ID_Subj=’К3’)
Поскольку нас интересует только, содержит ли подзапрос записи или
нет, то в целевом списке оператора SELECT подзапроса указана «*», а не
имена конкретных полей. Таким образом, для каждого студента из таблицы
СТУДЕНТ просматривается таблица УСПЕВАЕМОСТЬ и определяется,
встречается ли ID_Stud этого студента совместно со значением поля ID_Subj
равным курсу ’К3’. Если такой записи в таблице УСПЕВАЕМОСТЬ нет, то
ID_Stud вносится в результирующую таблицу. Таким образом, надо выпол-
нить просмотр таблицы УСПЕВАЕМОСТЬ столько раз, сколько зарегистри-
ровано студентов в таблице СТУДЕНТ. Очень затратное решение. Ответ на
запрос можно получить и более оптимальным способом с помощью некорре-
лированного подзапроса. Вычислим множество ID_Stud студентов, сдавав-
ших курс ‘К3’. Для каждого студента из таблицы СТУДЕНТ выясним, при-
надлежит ли его ID_Stud этому множеству.
38
Решение (2):
SELECT ID_Stud FROM СТУДЕНТ
WHERE.ID_Stud NOT IN (SELECT ID_Stud
FROM УСПЕВАЕМОСТЬ
WHERE ID_Subj=’К3’)
Однако существуют запросы, которые могут быть выполнены ТОЛЬКО
с помощью квантора существования. Как ни странно, это запросы на деление
(или квантор всеобщности!). Дело в том, что в первых реализациях SQL и
даже стандарте SQL-89 не предусматривалось квантора всеобщности
FORALL и запрос на квантор всеобщности «выполнено для всех (FOR ALL)
P(a)» заменялся согласно правилам логики квантором существования и двумя
отрицаниями – «не существует (NOT EXISTS ) не P(a)». Проиллюстрируем
сказанное на следующем примере.
Запрос 5: Перечислить Ф.И.О. таких студентов, которые сдали все эк-
замены.
Переформулируем вопрос с квантором всеобщности в более строгой
форме.
Запрос 5-1: Перечислить студентов таких, что для ВСЕХ дисциплин из
таблицы КУРС существуют соответствующие записи в таблице
УСПЕВАЕМОСТЬ с данным студентом.
Переформулируем вопрос с квантором существования.
Запрос 5-2: Перечислить Ф.И.О. таких студентов, что НЕ
СУЩЕСТВУЕТ дисциплины в таблице КУРС, для которой НЕ существует
соответствующей записи в таблице УСПЕВАЕМОСТЬ с данным студентом.
Решение:
SELECT ID_Stud, СФам FROM СТУДЕНТ AS СТ
WHERE NOT EXISTS (SELECT ID_Subj FROM КУРС
WHERE NOT EXISTS (SELECT *
FROM УСПЕВАЕМОСТЬ AS У
WHERE У.ID_Subj=КУРС.ID_Subj
AND У.ID_Stud=СТ.ID_Stud))
Операторы ALL, ANY, SOME
Квантора существования (NOT) EXISTS и оператора (NOT) IN доста-
точно для создания любых сложных запросов. Стандарт SQL-89 ограничи-
вался только этими возможностями. Однако, как известно, нет предела со-
вершенству. Коммерческие реализации языка стремились сделать SQL более
похожим на английский и, следовательно, доступным для неспециалистов.
Так появились операторы, реализующие такие сложные конструкции челове-
ческого языка как все (ALL), любой (ANY), некоторый (SOME). Позже они
были закреплены стандартом. Надо отметить, что их применение только за-
путывает даже специалистов, поскольку подразумевает множество нюансов
Страницы
- « первая
- ‹ предыдущая
- …
- 17
- 18
- 19
- 20
- 21
- …
- следующая ›
- последняя »