Оператор exists

Оператор 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: