С.Д. Кузнецов - Основы баз данных (1121716), страница 65
Текст из файла (страница 65)
«Звездочка» означает, что в генерируемых символьных строках элемент регулярного выражения, непосредственно предшествующий «звездочке», может появляться ноль или более раз. Использование в такой же ситуации специального символа ««» означает, что в генерируемых символьных строках элемент регулярного выражения, непосредственно предшествующий символу «плюс», может появляться один или более раз.
Другая форма определения набора символов иллюстрируется регулярным выражением 'тп1я ая ягггпд [: шцгт: ) '. В этом случае конструкция в квадратных скобках представляет любой одиночный символ, изображающий десятичную цифру. Другими допустимыми в Б()) идентификаторами наборов символов (геци1аг сьагяег ы) являются Аьрн)( (любой символ алфавита), БРРеР, (любой символ верхнего регистра), 1,0икп (любой символ нижнего регистра) и Аьн()м (любой алфавитно-цифровой символ).
302 Лекция 14 Язык баз данных ЯОЫ предикаты раздела \9Н ЕЛЕ опе атора ЯЕЬЕСТ Определяемый набор символов может задаваться нижней и верхней границей диапазона значений кодов допустимых символов. Например, в регулярном выражении 'Т)т1я гя яггзпд [3-8) ' конструкция в квадратных скобках представляет собой любой одиночный символ, изображающий цифры от 3 до 8 включительно. Заметим, что при задании диапазона можно использовать любые символы, но требуется, чтобы значение кода символа левой границы диапазона было не больше значения кода символа правой границы. Наконец, имеется егце одна возможность определения набора символов.
Соответствующая конструкция позволяет указать, какие символы из общего набора символов ВОЬ не входят в определяемый набор символов. Например, регулярное выражение ' я[ "г)*1пд% генерирует все символьные строки, у которых вторым символом является «Я», за которым (не обязательно непосредственно) следует подстрока «Тпд», но между «Я» и «Тпд» отсутствуют вхождения символа «г».
Как и в предикате 11)ге, символ, определенный в разделе ЕЯСАРЕ, поставленный перед любым специальным символом, отменяет специальную интерпретацию этого символа. В заключение данного пункта вернемся к отложенному в разделе «Скалярные выражения» лекции 13 обсуждению функции Я[]ЕЯТКТМС ... ЯТМТЕАК ... ЕЯСАРЕ. Напомним, что вызов этой функции определяется следующим синтаксисом: Я[]ВЯТК1ИЯ [сдагассег ча1це ехргеяяуоп Я1М1ЬАК с)тагассег ча1це ехргеяяуоп ЕЯСАРЕ сдагасгег ча1це ехргеяяуоп) Предположим, что в разделе ЕЯСАРЕ (который должен присутствовать обязательно) задан символ «х». Тогда символьная строка, задаваемая во втором операнде, должна иметь вид 'гехр1х"гехр2х"гехр3', где гехр1, гехр2 и гехр3 являются регулярными выражениями.
Функция пытается разделить символьную строку первого операнда на три раздела, первый из которых определяется путем сопоставления начала строки со строками, генерируемыми гехр1, второй — путем сопоставления оставшейся части строки первого операнда с гехр2 и третий — путем сопоставления конца этой строки с гехр3. Возвращаемым значением функции является средняя часть символьной строки первого операнда. Вот пример вызова функции: ЯУЕЯТК1ИЯ ( 'Тдуя Тв ясг1пд22' Я1М1ЕАК 'Т)т1я 1я1'[:АЕРНА:)+1"[еп101Т:]+' ЕЯСАРЕ 303 Основы бая данных К с Результатом будет строка 'ясгупс)'. Примеры запросов с использованном прадиката в1в1 1ат Пример 14.14. Найти номера и названия отделов, название которых начинается со слов 'нагс(нате' или ' Бо1снаге', а за ними (не обязательно непосредственно) следует последовательность десятичных цифр, предваряемых символом подчеркивания.
БЕЗВЕСТ РЕРТ МАМЕ, РЕРТ ИО РВОМ РЕРТ ИНЕВЕ РЕРТ МАМЕ Б1М1ЫВ ТО ' (МАВР(БОРТ)НАВЕЗ( (:0161Т:! +' ЕЯСАРЕ '('; Пример 14.15. Найти номера и названия проектов, название которых не начинается с последовательности цифр. ЯЕ1.ЕСТ РЕРТ МАМЕ, РЕРТ ИО РВОМ РЕРТ ННЕВЕ РЕРТ МАМЕ Я1М11 АВ ТО '["1-9)+Ъ'; Предикат ех1всв Преликат ех1я с я определяется следующим синтаксическим правилом: ехуягя ргес(усаяе :с= ЕХ1ЯТЯ (с(песу ехргеяяуоп) Значением условия ех1ятБ (с)песу ехргеяязоп) является (где в том и только в том случае, когда мощность таблицы-результата выражения запросов больше нуля, иначе значением условия является~а)зе. Примеры запросов с использованном предиката вхх в с в Пример 14.16.
Найти номера отделов, среди служащих которых имеются менеджеры проектов. БЕЗВЕСТ РЕРТ.РЕРТ НО РВОМ РЕРТ ННЕВЕ ЕХ1БТБ (БЕ1 ЕСТ ЕМР. ЕМР ИО РВОМ ЕМР ННЕВЕ ЕМР.РЕРТ МО = РЕРТ.РЕРТ МО АИР ЕХ1БТЯ (БЕ! ЕСТ РВО.РВО МИО РВОМ РВО ННЕВЕ РВО.РВО МИО = ЕМР.ЕМР НО)); 304 Лекция 14 Язык баэ данных БОЬ: и едикаты раздела)к(НЕВЕ опе ато ЯЕЬЕСТ Эту формулировку можно упростить, избавившись от самого вложенного запроса (прпмер 14.1ба): ЯЕЬЕСТ РЕРТ.РЕРТ ИО РВОМ РЕРТ ХНЕВЕ ЕХТЯТБ (БЕ(,ЕСТ ЕМР.ЕМР НО РВОМ ЕМР, РКО ХНЕВК ЕМР.РЕРТ НО = РЕРТ.РЕРТ ИО РНР РВО.РВО МИС = ЕМР.КМР ИО); Далее заметим, что по смыслу предиката ехтЯтБ список выборки во вложенном подзапросе является несущественным, и формулировку запроса можно изменить, например, следуюшим образом (прпмер 14.16Ь): БЕЬЕСТ РКРТ.РЕРТ НО РВОМ РЕРТ ХНЕВЕ ЕХТБТБ (БЕЬЕСТ * РВОМ ЕМР, РЕРТ ХНЕКЕ ЕМР.РКРТ ИО = РЕРТ.РЕРТ ИО АЫР РВО.РКО ММС = ЕМР.КМР НО); Запросы с предикатом ехтЯтЯ можно также перефОрмулировать в виде запросов с предикатом сравнения (прпмер 14.1бс): БЕЬЕСТ РКРТ.РЕРТ НО РКСМ РЕРТ ХНЕКЕ (ЯЕЬЕСТ СОРНТ(*) РВОМ ЕМР, РЕРТ ХНЕКЕ ЕМР.РЕРТ НО = РЕРТ.РКРТ НО йМР РКО.РВО МИС = ЕМР.ЕМР ИО ) >= 1; Пример 14.17.
Найти номера отделов, размер заработной платы сотрудников которых не превышает размер заработной платы руководителя отдела. БЕЬЕСТ РКРТ.РЕРТ МО РВОМ РЕРТ ХНЕВЕ НОТ ЕХ1БТБ (ЯЕЬЕСТ * РВОМ ЕМР ЕМР1, ЕМР ЕМР2 305 Основы Оаз данных к рс ХНЕВЕ ЕМР1. ЕМР ИО = ОЕРТ.ОЕРТ МНО АМ0 ЕМР2.0ЕРТ МО = 0ЕРТ.ОЕРТ МО АН0 ЕМР2.ЕМР ЯАЬ > ЕМР1.ЕМР ЯАЬ); Предикат пп1<рье Этот предикат позволяет сформулировать условие отсутствия дубликатов в результате запроса: ип1опе ргес11саге ::= ОХТОНК (с)негу ехргевя1оп) Результатом вычисления условия ОМТОНК (с)негу ехргеве1оп) является Ьие в том и только в том случае, когда в таблице-результате выражения запросов отсутствуют какие-либо две строки, одна из которых является дубликатом другой.
В противном случае значение условия есть|а!и. Примеры запросов с использованием прадиката ип1ди е Пример 14.18. Найти номера отделов, служащих которых можно различить по имени и дате рождения. ЯЕЬКСТ 0ЕРТ МО РВОМ 0ЕРТ ХНЕВЕ ОН1ООЕ (ЯЕЬЕСТ ЕМР МАМЕ, ЕМР ВОАТЕ РВОМ ЕМР ХНЕВЕ ЕМР.ОЕРТ ИО = ОЕРТ.ОЕРТ ИО); Возможна альтернативная, но более сложная формулировка этого запроса с использованием предиката нот ех1ЯтЯ (пример 14.18а): ЯЕЬЕСТ ОЕРТ ЫО РВОМ 0ЕРТ ХНЕВЕ МОТ ЕЯ1ЯТЯ (ЯЕЬЕСТ * РВОМ ЕМР, ЕМР ЕМР1 ХНЕВЕ ЕМР1.ЕМР ИО <> ЕМР.ЕМР ИО АН0 ЕМР.ОЕРТ НО = ОЕРТ.ОЕРТ НО АНО ЕМР1.0ЕРТ ИО = ОЕРТ.ОЕРТ ИО АМО КМР1.ЕМР МАМЕ = ЕМР.ЕМР МАМЕ АН0(КМР1.ЕМР ВОАТЕ = ЕМР.ЕМР ВОАТЕ ОВ (ЕМР.ЕМР ЕОАТК 1Я МЛЬ АН0 ЕМР1.ЕМР ВОАТЕ 1Я НОЬ1))); Лекция та Язык баз данных 80цк предикаты раздела ч)НЕВЕ оператора ЯЕСЕОТ Если же ограничиться требованием уникальности имен служащих, то возможна следующая формулировка (пример 14.18Ь): ЯЕРЕСТ РЕРТ ИО РВОМ РЕРТ ХНЕЕЕ (ЯЕ(.ЕСТ СОПЯТ (ЕМР МАМЕ) РВОМ ЕМР ХНЕЕЕ ЕМР.РЕРТ ХО = РЕРТ.РЕРТ ХО) (ЯЕРЕСТ СОРМТ (Р1ЯТ1ХСТ ЕМР МАМЕ) РВОМ ЕМР ХНЕЕЕ ЕМР.РЕРТ ИО = РЕРТ.РЕРТ ИО); Предикат очес1арв Этот предикат служит лля проверки перекрытия во времени двух событий.
Условие определяется следующим синтаксисом: очег1арз ргес)1сасе ::= гох ча1це сопзсгцсоог ОЧЕКРАРЯ гох ча1це сопзсгиссог Степень каждой из строк-операндов должна быть равна 2. Тип данных первого столбца каждого из операндов должен быть типом даты-времени, и типы данных первых столбцов должны быть совместимы. Тип данных второго столбца каждого из операндов должен быть типом даты- времени или интервала. При зтом: я если это тип интервала, тоточностьтипадолжнабытьтакой, чтобы интервал можно было прибавить к значению типа дата-время первого столбца; ° если зто тип дата-время, то он должен быть совместим с типом данных дата-время первого столбца.
Пусть Р1 и Р2 — значения первого столбца первого и второго операндов соответственно. Если второй столбец первого операнда имеет тип лата- время, то пусть е1 обозначает его значение. Если второй столбец первого ОПЕраНда ИМЕЕТ тИП 1ХТЕЕУАР, тс ПуСтЬ 11 — ЕГО ЗНаЧЕНИЕ, а Е1 = РТ а 11. Если Р1 является неопределенным значением или если Е1 < Р1, то пусть 81 = Е1ит1 = Р1. В противном случае, пусть 81 = Р1и Т1 = 81.Аналогично определяются Я2 и Т2 применительно ко второму операнду Результат условия совпадает с результатом вычисления следующего булевского выражения: (Я1 > Я2 АХР ХОТ (Я1 >= Т2 АМР Т1 >= Т2) ) ОЕ (Я2 > Я1 АИР ХОТ (82 >= Т1 АХР Т2 >= Т1)) 307 Основы баз данных Курс ОВ (Б1 = Б2 АМР (Т1 <> Т2 ОВ Т1 = Т2)) Примеры запросов с использованием предиката от ет1арв Пример 14.19.
Найти номера проектов, которые выполнялись в пе- риод с 15 января 2000 г. по 3! декабря 2002 г. ЯЕЬЕСТ РВО МО РВОМ РВО )(НЕВЕ (РВО ЯОАТК, РВО ООВАТ) О)ГКВЬАРЯ (ОАТЕ '2000-01-15', ОАТЕ '2002-12-31'); Пример 14.20. Найти названия проектов, которые будут выполнять- ся в течение следующего года. ЯЕЬЕСТ РВО Т1ТЬЕ РВОМ РВО ЫНЕВЕ (РВО ЯРАТЕ, РВО ООВАТ) 07ЕВЬАРЯ (СОВВЕИТ ВАТЕ, 1ИТЕВЧАЬ '1' УЕАВ); Предикат сравнения с квантором Этот предикат позволяет специфицировать квантифицированное сравнение строчного значения и определяется следующим синтаксическим правилом: спапс1йкес) совраг1аоп ргег)1сасе ::= гон та1пе сопасгцссог совр ор ( АЬЬ ) ЯОМЕ ) АИУ ) снегу ехргеаакоп Степень первого операнда должна быть такой же, как и степень таблицы-результата выражения запросов.
Типы данных значений строки- операнда должны быть совместимы с типами данных соответствующих столбцов выражения запроса. Сравнение строк производится по тем же правилам, что и для предиката сравнения. Обозначим через х строку-первый операнд, а через я — результат вычисления выражения запроса. Пусть а обозначает произвольную строку таблицы Я. Тогда: ° условие х совр ср Аьь яимеетзначениеггиевтом итольковтомслучае, когда я пусто, или значение условия х совр ор а равно ггие для каждой строки а, входящей в я.