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

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

SELECT DEPT_NAME, DEPT_NO

FROM DEPT

WHERE DEPT_NAME SIMILAR TO

'(HARD|SOFT)WARE%\_[:DIGIT:]+' ESCAPE '\';

Пример 14.14. Найти номера и названия отделов, название которых начинается со слов 'Hardware' или 'Software', а за ними (не обязательно непосредственно) следует последовательность десятичных цифр, предваряемых символом подчеркивания. (html, txt)

SELECT DEPT_NAME, DEPT_NO

FROM DEPT

WHERE DEPT_NAME SIMILAR TO '[^1-9]+%';

Пример 14.15. Найти номера и названия проектов, название которых не начинается с последовательности цифр. (html,txt)

Предикат exists

Предикат exists определяется следующим синтаксическим правилом:

exists_predicate ::= EXISTS (query_expression)

Значением условия EXISTS (query_expression) является true в том и только в том случае, когда мощность таблицы-результата выражения запросов больше нуля, иначе значением условия является false.

Примеры запросов с использованием предиката 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)

Предикат unique

Этот предикат позволяет сформулировать условие отсутствия дубликатов в результате запроса:

unique_predicate ::= UNIQUE (query_expression)

Результатом вычисления условия UNIQUE (query_expression) является true в том и только в том случае, когда в таблице-результате выражения запросов отсутствуют какие-либо две строки, одна из которых является дубликатом другой. В противном случае значение условия есть false.

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

SELECT DEPT_NO

FROM DEPT

WHERE UNIQUE

(SELECT EMP_NAME, EMP_BDATE

FROM EMP

WHERE EMP.DEPT_NO = DEPT.DEPT_NO);

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

Возможна альтернативная, но более сложная формулировка этого запроса с использованием предиката NOT EXISTS (пример 14.18.1):

SELECT DEPT_NO

FROM DEPT

WHERE NOT ESISTS

(SELECT *

FROM EMP, EMP EMP1

WHERE EMP1.EMP_NO <> EMP.EMP_NO

AND EMP.DEPT_NO = DEPT.DEPT_NO

AND EMP1.DEPT_NO = DEPT.DEPT_NO

AND EMP1.EMP_NAME = EMP.EMP_NAME

AND(EMP1.EMP_BDATE = EMP.EMP_BDATE

OR (EMP.EMP_BDATE IS NULL

AND EMP1.EMP_BDATE IS NULL)));

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

Если же ограничиться требованием уникальности имен служащих, то возможна следующая формулировка (пример 14.18.2):

SELECT DEPT_NO

FROM DEPT

WHERE (SELECT COUNT (EMP_NAME)

FROM EMP

WHERE EMP.DEPT_NO = DEPT.DEPT_NO) =

(SELECT COUNT (DISTINCT EMP_NAME)

FROM EMP

WHERE EMP.DEPT_NO = DEPT.DEPT_NO);

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

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