Запросы, использующие 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)?