Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы базы Данных / Базы данных / Введение в модель данных SQL.doc
Скачиваний:
83
Добавлен:
22.03.2015
Размер:
1.93 Mб
Скачать

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

SELECT EMP_NO

FROM EMP

WHERE DEPT_NO = 65

AND EMP_SAL > SOME (SELECT EMP1.EMP_SAL

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO);

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

Одна из возможных альтернативных формулировок этого запроса может основываться на использовании предиката EXISTS (пример 14.21.1):

SELECT EMP_NO

FROM EMP

WHERE DEPT_NO = 65

AND EXISTS(SELECT *

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO

AND EMP.EMP_SAL > EMP1.EMP_SAL);

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

Вот альтернативная формулировка этого запроса, основанная на использовании агрегатной функции MIN (пример 14.21.2):

SELECT EMP_NO

FROM EMP

WHERE DEPT_NO = 65 AND

EMP_SAL > (SELECT MIN(EMP1.EMP_SAL)

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO);

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

SELECT EMP_NO, EMP_NAME

FROM EMP

WHERE DEPT_NO = 65 AND

EMP_NAME = SOME (SELECT EMP1.EMP_NAME

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO

AND EMP.EMP_NO <> EMP1.EMP_NO);

Пример 14.22. Найти номера и имена сотрудников отдела 65, однофамильцы которых работают в этом же отделе. (html,txt)

Заметим, что эта формулировка эквивалентна следующей формулировке (пример 14.22.1):

SELECT EMP_NO, EMP_NAME

FROM EMP

WHERE DEPT_NO = 65 AND

EMP_NAME IN (SELECT EMP1.EMP_NAME

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO

AND EMP.EMP_NO <> EMP1.EMP_NO);

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

Возможна формулировка с использованием агрегатной функции COUNT (пример 14.22.2):

SELECT EMP_NO, EMP_NAME

FROM EMP

WHERE DEPT_NO = 65 AND

(SELECT COUNT(*)

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO

AND EMP.EMP_NO <> EMP1.EMP_NO ) >= 1;

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

Наиболее лаконичным образом этот запрос можно сформулировать с использованием соединения (пример 14.22.3):

SELECT DISTINCT EMP.EMP_NO, EMP.EMP_NAME

FROM EMP, EMP EMP1

WHERE EMP.DEPT_NO = 65

AND EMP.EMP_NAME = EMP1.EMP_NAME

AND EMP.DEPT_NO = EMP1.DEPT_NO

AND EMP.EMP_NO <> EMP1.EMP_NO;

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

В последней формулировке мы вынуждены везде использовать квалифицированные имена столбцов, потому что на одном уровне используются два вхождения таблицы EMP.

SELECT EMP_NO

FROM EMP

WHERE DEPT_NO = 65

AND EMP_SAL >= ALL(SELECT EMP1.EMP_SAL

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO);

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

Одна из возможных альтернативных формулировок этого запроса может основываться на использовании предиката NOT EXISTS (пример 14.23.1):

SELECT EMP_NO

FROM EMP

WHERE DEPT_NO = 65

AND NOT EXISTS (SELECT *

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO

AND EMP.EMP_SAL < EMP1.EMP_SAL);

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

Можно сформулировать этот же запрос с использованием агрегатной функции MAX (пример 14.23.2):

SELECT EMP_NO

FROM EMP

WHERE DEPT_NO = 65

AND EMP_SAL = (SELECT MAX(EMP1.EMP_SAL)

FROM EMP EMP1

WHERE EMP.DEPT_NO = EMP1.DEPT_NO);

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

SELECT EMP_NO, EMP_NAME

FROM EMP

WHERE EMP_NAME <> ALL (SELECT EMP1.EMP_NAME

FROM EMP EMP1

WHERE EMP1.EMP_NO <> EMP.EMP_NO);

Пример 14.24. Найти номера и имена сотрудников, не имеющих однофамильцев (html,txt)

Этот запрос можно переформулировать на основе использования предиката NOT EXISTS или агрегатной функции COUNT (по причине очевидности мы не приводим эти формулировки), но, в отличие от случая в примере 14.22.3, формулировка в виде запроса с соединением здесь не проходит. Формулировка запроса

SELECT DISTINCT EMP_NO, EMP_NAME

FROM EMP, EMP EMP1

WHERE EMP.EMP_NAME <> EMP1.EMP_NAME

AND EMP1.EMP_NO <> EMP.EMP_NO);

эквивалентна формулировке

SELECT EMP_NO, EMP_NAME

FROM EMP

WHERE EMP_NAME <> SOME (SELECT EMP1.EMP_NAME

FROM EMP EMP1

WHERE EMP1.EMP_NO <> EMP.EMP_NO);

Очевидно, что этот запрос является бессмысленным ("Найти сотрудников, для которых имеется хотя бы один не однофамилец").

Соседние файлы в папке Базы данных