Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
160
Добавлен:
16.03.2016
Размер:
6 Мб
Скачать
☆

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

Пример 18.9. Найти номера, имена и номера отделов служащих, работающих в отделах 15, 17 и 19.

SELECT EMP_NO, EMP_NAME, DEPT_NO

FROM EMP

WHERE DEPT_NO IN (15, 17, 19);

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

SELECT EMP_NO, EMP_NAME, DEPT_NO

FROM EMP

WHERE DEPT_NO = 15

OR DEPT_NO = 17

OR DEPT_NO = 19;

Пример 18.10. Найти номера служащих, не являющихся руководителями отделов и получающих заплату, размер которой равен размеру зарплаты какого-либо руководителя отдела.

SELECT EMP_NO

FROM EMP

WHERE EMP_NO NOT IN (SELECT DEPT_MNG FROM DEPT)

AND EMP_SAL IN (SELECT EMP_SAL FROM EMP,

DEPT WHERE EMP_NO = DEPT_MNG);

Запросы, содержащие предикатINс подзапросом, легко переформулировать в запросы с соединениями. Например, запрос изпримера 18.10эквивалентен следующему запросу с соединениями (пример 18.10.1):

SELECT DISTINCT EMP_NO

FROM EMP, EMP EMP1, DEPT

WHERE EMP_NO NOT IN (SELECT DEPT_MNG FROM DEPT)

AND EMP_SAL = EMP1_SAL

AND EMP1.EMP_NO = DEPT.DEPT_MNG;

По поводу этой второй формулировки следует сделать два замечания. Во-первых, как видно, мы изменили только ту часть условия, в которой использовался предикат IN, и не затронули предикатNOT IN. Запросы с предикатамиNOT INзапросами с соединениями так просто не заменяются. Во-вторых, в разделеSELECTбыло добавлено ключевое словоDISTINCT, потому что в результате запроса во второй формулировке для каждого служащего будет содержаться столько строк, сколько существует руководителей отделов, получающих такую же зарплату, что и данный служащий.

18.2.5. Предикат like

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

like_predicate ::= source_value [ NOT ]

LIKE pattern_value [ ESCAPE escape_value ]

source_value ::= value_expression

pattern_value ::= value_expression

escape_value ::= value_expression

Все три операнда (source_value, pattern_value и escape_value) должны быть одного типа: либо типа символьных строк, либо типа битовых строк139). В первом случае значением последнего операнда должна быть строка из одного символа, во втором – строка из 8 бит. Второй операнд, как правило, задается литералом соответствующего типа. В обоих случаях значение предиката равняетсяtrueв том и только в том случае, когда исходная строка (source_value) может быть сопоставлена с заданным шаблоном (pattern_value).

Если обрабатываются символьные строки, и если раздел ESCAPEусловия отсутствует, то при сопоставлении шаблона со строкой производится специальная интерпретация двух символов шаблона: символ подчеркивания ('_') обозначает любой одиночный символ; символ процента ('%') обозначает последовательность произвольных символов произвольной длины (длина последовательности может быть нулевой). Если же разделESCAPEприсутствует и специфицирует некоторый одиночный символx, то пары символов «x_» и «x%» представляют одиночные символы «_» и «%» соответственно.

В случае обработки битовых строк сопоставление шаблона со строкой производится восьмерками соседних бит (октетами). В соответствии со стандартом SQL:1999, при сопоставлении шаблона со строкой производится специальная интерпретация октетов со значениямиX'25'иX'5F'(коды символов подчеркивания и процента в кодировке ASCII). Первый октет обозначает любой одиночный октет, а второй – последовательность произвольной длины произвольных октетов (длина может быть нулевой). В разделе ESCAPE указывается октет, отменяющий специальную интерпретацию октетовX'25'иX'5F'.

Значение предиката likeестьunknown, если значение первого или второго операндов является неопределенным. Условие x NOT LIKE y ESCAPE z эквивалентно условию NOT x LIKE y ESCAPE z.