Запросы, использующие EXISTS (существует).

Квантор существования EXISTS - понятие, заимствованное из формальной логики. В языке SQL предикат с квантором существования представляется выражением EXISTS (SELECT * FROM ...).

Такое выражение считается истинным только тогда, когда результат вычисления “SELECT * FROM ...”, является непустым множеством, т.е. когда существует какая-либо запись в таблице, указанной во фразе FROM подзапроса, которая удовлетворяет условию WHERE подзапроса. (Практически этот подзапрос всегда будет коррелированным множеством.)

Рассмотрим пример. Выдать названия поставщиков, поставляющих продукт с номером 11.

SELECT Название ¦ Результат: Название

FROM Поставщики ¦ --------

WHERE EXISTS ¦ СЫТНЫЙ

(SELECT * ¦ УРОЖАЙ

FROM Поставки ¦ КОРЮШКА

WHERE ПС = Поставщики.ПС ¦ ЛЕТО

AND ПР = 11); ¦

 

Система последовательно выбирает строки таблицы Поставщики, выделяет из них значения столбцов Название и ПС, а затем проверяет, является ли истинным условие существования, т.е. есть ли в таблице Поставки хотя бы одна строка со значением ПР=11 и значением ПС, равным значению ПС, выбранному из таблицы Поставщики. Если условие выполняется, то полученное значение столбца Название включается в результат.

Предположим, что первые значения полей Название и ПС равны, соответственно, ‘СЫТНЫЙ’ и 1. Так как в таблице Поставки есть строка с ПР=11 и ПС=1, то значение СЫТНЫЙ должно быть включено в результат.

Хотя этот первый пример только показывает иной способ формулировки запроса для задачи, решаемой и другими путями (с помощью оператора IN или соединения), EXISTS представляет собой одну из наиболее важных возможностей SQL. Фактически любой запрос, который выражается через IN, может быть альтернативным образом сформулирован также с помощью EXISTS. Однако обратное высказывание несправедливо.

Запросы, использующие NOT EXISTS (не существует).

Выдать название и статус поставщиков, не поставляющих продукт с номером 11.

SELECT Название, Статус ¦ Название Статус

FROM Поставщики ¦ -------- ----------

WHERE NOT EXISTS ¦ ПОРТОС кооператив

(SELECT * ¦ ШУШАРЫ совхоз

FROM Поставки ¦ ТУЛЬСКИЙ универсам

WHERE ПС = Поставщики.ПС ¦ ОГУРЕЧИК ферма

AND ПР = 11); ¦

 

Задание

На основе базы данных, разработанной на предыдущей лабораторной работе постройте не менее пятнадцати осмысленных вложенных запросов к базе. Отчет должен содержать: тему, цель, описание цели каждого из запросов, запись запроса, полученный результат, вывод.

Контрольные вопросы

1. Для чего используються простые вложенные подзапросы?

2. Какие виды подзапросов существуют?

3. С помощью каких условий подзапросы включаються в фразу WHERE (HAVING)?