logo search
Лабы базы Данных / Базы данных / Введение в модель данных SQL

Примеры запросов с использованием предиката exists

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE EXISTS

(SELECT EMP.EMP_NO

FROM EMP

WHERE EMP.DEPT_NO = DEPT.DEPT_NO

AND EXISTS

(SELECT PRO.PRO_MNG

FROM PRO

WHERE PRO.PRO_MNG = EMP.EMP_NO));

Пример 14.16. Найти номера отделов, среди сотрудников которых имеются менеджеры проектов. (html,txt)

Эту формулировку можно упростить, избавившись от самого вложенного запроса (пример 14.16.1):

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE EXISTS

(SELECT EMP.EMP_NO

FROM EMP, PRO

WHERE EMP.DEPT_NO = DEPT.DEPT_NO

AND PRO.PRO_MNG = EMP.EMP_NO);

Пример 14.16.1. (html,txt)

Далее заметим, что по смыслу предикат предиката EXISTS список выборки во вложенном подзапросе является несущественным, и формулировку запроса можно изменить, например, следующим образом (пример 14.16.2):

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE EXISTS

(SELECT *

FROM EMP, DEPT

WHERE EMP.DEPT_NO = DEPT.DEPT_NO

AND PRO.PRO_MNG = EMP.EMP_NO);

Пример 14.16.2. (html,txt)

Запросы с предикатом EXISTS можно также переформулировать в виде запросов с предикатом сравнения (пример 14.16.3):

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE (SELECT COUNT(*)

FROM EMP, DEPT

WHERE EMP.DEPT_NO = DEPT.DEPT_NO

AND PRO.PRO_MNG = EMP.EMP_NO ) >= 1;

Пример 14.16.3. (html, txt)

SELECT DEPT.DEPT_NO

FROM DEPT

WHERE NOT EXISTS

(SELECT *

FROM EMP EMP1, EMP EMP2

WHERE EMP1.EMP_NO = DEPT.DEPT_MNG AND

EMP2.DEPT_NO = DEPT.DEPT_NO AND

EMP2.EMP_SAL > EMP1.EMP_SAL);

Пример 14.17. Найти номера отделов, размер заработной платы сотрудников которых не превышает размер заработной платы руководителя отдела. (html,txt)