Оператор EXISTS используется для указания предикату на то, чтобы производить или не производить вывод в подзапросе, при этом EXISTS дает в качестве результата значение ИСТИНА или ЛОЖЬ. Он может работать в предикате или в комбинации с другими булевскими выражениями –AND, OR и NOT.
Пример 1.Нужно решить, извлекать ли данные из таблицы успеваемости, если в ней присутствуют отличные оценки.
SELECT *
FROM USP
WHERE USP.OCENKA=5
AND EXISTS
(SELECT *
FROM USP
WHERE USP.OSENKA=5);
Результат запроса:
UNUM OCENKA UDATE SNUM PNUM
-----------------------------------------------------------------------------
1001 5 10/06/1999 3412 2001
1005 5 12/06/1999 3416 2006
В соотнесенном подзапросе, предложение EXISTS оценивается отдельно для каждой строки таблицы, имя которой указано во внешнем запросе, точно так же, как и другие операторы предиката, когда используется соотнесенный подзапрос.
Пример 2. Вывести информацию о студентах, которые имеют несколько оценок:
SELECT DISTINCT SNUM
FROM USP FIRST
WHERE EXISTS
(SELECT *
FROM USP SECOND
WHERE SECOND. SNUM= FIRST. SNUM
AND SECOND / PNUM < > FIRST. PNUM);
Результат запроса:
SNUM
--------
Для иллюстрации возможности использования комбинации из EXISTS и объединения. Усовершенствуем последний пример таким образом, чтобы выводилась более подробная информация о студентах:
|
|
SELECT DISTINCT FIRST. SNUM, FIRST. SFAM, FIRST.SIMA, FIRST.SOT
FROM STUDENT FIRST, USP SECOND
WHERE EXISTS
(SELECT *
FROM USP THIRD
WHERE SECOND. SNUM= THIRD. SNUM
AND SECOND. PNUM < > THIRD. PNUM)
AND FIRST. SNUM= SECOND. SNUM;
Результат запроса:
SNUM SFAM SIMA SOTCH
-----------------------------------------------------------------
3412 Поляков Анатолий Алексеевич
Наиболее очевидным способом использования EXISTS является сочетание с оператором NOT.
Пример 3. Получитть информацию о студентах, имеющих только одну оценку.
SELECT DISTINCT FIRST. SNUM, FIRST. SFAM, FIRST.SIMA, FIRST.SOT
FROM STUDENT FIRST, USP SECOND
WHERE NOT EXISTS
(SELECT *
FROM USP THIRD
WHERE SECOND. SNUM= THIRD. SNUM
AND SECOND. PNUM < > THIRD. PNUM)
AND FIRST. SNUM= SECOND. SNUM;
Результат запроса:
SNUM SFAM SIMA SOTCH
-----------------------------------------------------------------
3413 Старова Любовь Михайловна
Важным свойством EXISTS является то, что он не может взять агрегатную функцию в подзапросе, так как если агрегатная функция нашла какие-либо записи для операций с ними, то EXISTS будет верен в любом случае. Выходом их такой ситуации является использование вложенного подзапроса в подзапросе, в предикате которого присутствует EXISTS. Этопозволяет тщательно структурировать запросы, делая их более понятными.
Пример 4. Получить информацию о студентах, имеющих более одной оценки.
SELECT *
FROM STUDENT FIRST
WHERE EXISTS
(SELECT *
FROM USP SECOND
WHERE. FIRST. SNUM= SECOND. SNUM
AND 1<
(SELECT COUNT (*)
FROM USP
WHERE USP. SNUM= SECOND. SNUM));
Результат запроса:
SNUM SFAM SIMA SOTCH STIP
------------------------------------------------------------------------------
3412 Поляков Анатолий Алексеевич 25.50