С.Д. Кузнецов - Основы баз данных (1121716), страница 64
Текст из файла (страница 64)
Найти номера служащих, не являющихся руководителями отделов и получающих заплату, размер которой равен размеру зарплаты какого-либо руководителя отдела. ЯЕЬЕСТ ЕМР МО РНОМ ЕМР ХНЕНЕ ЕМР НО НОТ 1И (ЯЕРЕСТ РЕРТ МИН РНОМ РЕРТ) АНР ЕМР ЯАБ 1И (ЯЕЬЕСТ ЕМР ЯАЬ РЕЯМ ЕМР, РЕРТ ИНЕНЕ ЕМР НО = РЕРТ ММО); Запросы, содержащие предикат 1н с подзапросом, легко переформулировать в запросы с соединениями. Например, запрос из примера 14.10 эквивалентен следующему запросу с соединениями (пример 14.10а): ЯЕЬЕСТ Р1ЯТ1ИСТ ЕМР ИО РНОМ ЕМР, ЕМР ЕМР1, РЕРТ ННЕНЕ ЕМР ИО НОТ 1И (ЯЕЬЕСТ РЕРТ МИР РНОМ РЕРТ) АНР ЕМР ЯАЬ = ЕМР1 ЯАЬ АИР ЕМР1.ЕМР ИО = РЕРТ.РЕРТ МНО; По поводу этой второй формулировки следует сделать два замечания.
Во-первых, как видно, мы изменили только ту часть условия, в которой использовался предикат 1н, и не затронули предикат МОТ 1М. Запросы с предикатами МОТ 1Н запросами с соединениями так просто не заменяются. Во-вторых, в разделе ЯЕРЕСТ было добавлено ключевое слово РТЯТ1НСТ, потому что в результате запроса во второй формулировке для каждого сотрудника будет содержаться столько строк, сколько существует руководителей отделов, получающих такую же зарплату что и данный служащий. ПрЕдикат Шсе Формально предикат 11ке определяется следующими синтаксическими правилами: 11)се ргес(1саге ::= яоигсе уа1ие [ НОТ ) й|КЕ рапгегп уа1ие [ ЕЯСАРЕ еясаре уа1ие яоигсе уа1ие ::= уа1ие ехргеяв(оп рассегп уа1ие ::= уа1ие ехргеяя(оп еясаре уа1ие ::= уа1ие ехргеяя(оп Все три операнда (яоигсе уа1ие, рассегп уа1ие и еясаре уа1ие) должны быть одного типа: либо типа символьных строк, либо типа бито- 298 Лекция 14 Язык баз данных ЗОЬ: преднкаты раздела 99НЕВЕ оператора БЕЬЕСТ вых строк*.
В первом случае значением последнего операнда должна быть строка из одного символа, во втором — строка из 8 бит. Второй операнд, как правило, задается литералом соответствующего типа. В обоих случаях значение предиката равняется в ие в том и только в том случае, когда исходная строка (вон»се са1це) может быть сопоставлена с заданным шаблоном (рав.етп т»а1це). Если обрабатываются символьные строки, и если раздел еБОАРе условия отсутствует, то при сопоставлении шаблона со строкой производится специальная интерпретация двух символов шаблона: символ подчеркивания (' ') обозначает любой одиночный символ; символ процента (' В ') обозначает последовательность произвольных символов произвольной длины (длина последовательности может быть нулевой).
Если же раздел ЕБСЛРЕ присутствует и специфицирует некоторый одиночный символ х, то пары символов «х» и «хь» представляют одиночные символы «» и «З» соответственно. В случае обработки битовых строк сопоставление шаблона со строкой производится восьмерками соседних бит (окпзепзами). В соответствии со стандартом Я~(.:!999, при сопоставлении шаблона со строкой производится специальная интерпретация октетов со значениями х'25' и х'5Р' (коды символов подчеркивания и процента в кодировке АЕСП).
Первый октет обозначает любой одиночный октет, а второй — последовательность произвольной длины произвольных октетов (длина может быть нулевой). В разделе еяслре указывается октет, отменяющий специальную интерпретацию октетов х'25' и х'5» '. Значение предиката 11йе есть ип»споив, если значение первого или второго операндов является неопределенным.
Условие х МОТ БТКЕ у еБслре гэквивалентно условиюмОт х ьгке у езслре г. Примеры запросов с использованием предиката 1згси Пример 14.11. Найти номера проектов, в названии которых присутствуют слова 'лех- ' и 'втер'. Слова должнь1 следовать именно в такой последовательности, но слово ' пехв ' может быть первым в названии проекта.
БЕЬЕСТ РВО Т1ТЬЕ РВОМ РВО ГНЕВЕ РВО 11ТЬЕ Ь|КЕ 'ЪпехВВвсерв' ОВ РВО Т1ТЬЕ ЬТКЕ екехьквсерв'; Это очень неудачный запрос, потому что его выполнение, скорее всего, вынудит СУБД просмотреть все строки таблицы РВО и для каждой ' В стандарте БОгл 1999 разрешается применять предикат ш к в только для битовых строк ти- па вьсв. Битовые строки типов втт и втт уквттке не допускаются. 299 Основы баа данных Курс строки выполнить две проверки столбца РВО Т1ТЬЕ.
Можно немного улучшить формулировку с небольшим риском получить неверный ответ (пример 14.11а): ЯЕЬЕСТ РВО Т1ТЬЕ РВОМ РВО ИНЕВЕ РВО Т1ТЬЕ ЫКЕ 'ЪеххаагерЪ'; Пример 14.12. Найти номера отделов, служащие которых являются менеджерами проектов, и название каждого из этих проектов начинается с названия отдела. ЯЕЬЕСТ О1ЯТ1ИСТ РЕРТ.ОЕРТ ИО РВОМ ЕМР, ОЕРТ, РВО ХНЕВЕ ЕМР.ЕМР ИО = РВО.РВО МИС АИР ЕМР.ОЕРТ ИО = РЕРТ.РЕРТ ИО АИО РВО.РВО Т|ТЬЕ ЫКЕ ОЕРТ.ОЕРТ МАМЕ ]] 'Ъ'; Вот как может выглядеть формулировка этого запроса, если использовать вложенные подзапросы (пример 14.12а): ЯЕЬЕСТ РЕРТ.ОЕРТ ИО РВОМ ОЕРТ ИНЕВЕ ОЕРТ.РЕРТ ИО 1И [ЯЕЬЕСТ ЕМР.ОЕРТ ИО РВОМ ЕМР ХНЕВЕ ЕМР.ЕМР ИО 1И [ЯЕЬЕСТ РВО.РВО МИО РВОМ РВО Х??ЕВЕ РВО.РВО Т1Т? Е ? |КЕ РКРТ.ОЕРТ МАМЕ ]] 'в']]; Пример 14.13.
Найти номера отделов, названия которых не начинаются со слова 'Яо|хиахе'. ЯЕЬЕСТ ОЕРТ ИО РВОМ ОЕРТ ЖМЕНЕ ОЕРТ ИАМЕ ИОТ ЫКЕ 'Яо1хиагеЪ'; Предмкат в|и||ах Формально предикат а|ли |аг определяется следующими синтаксическими правилами: а|и||аг ргег?|саге::= аоихсе уа|ие [ ИОТ ] Я1м1ьАВ тО раггехп уа1ие [ еБсАРе еасаре уа1ие ] 300 Лекция! 4 Язык баз данных 80Ы лредикаты раздела ГНЕВЕ оператора ЗЕкЕСТ яоцгсе ча1це ::= сЬатастет ехргеяя(оп рагтегп ча1це ::= сЬагастег ехргеяя(оп еясаре ча1це ::= сЬатастет ехргеяя(оп Все три операнда (яоцтсе ча1це, рагтетп ча1це и еясаре ча1це) должны иметь тип символьных строк. Значением последнего операнда должна быть строка из одного символа.
Второй операнд, как правило, задается литералом соответствующего типа. В обоих случаях значение предиката равняется ггие в том и только в том случае, когда шаблон (раттетп ча1це) должным образом сопоставляется с исходной строкой (яоцгсе ча1це). Основное отличие предиката я)в11ат от рассмотренного ранее предиката 11ке состоит в существенно расширенных возможностях задания шаблона, основанных на использовании правил построения регулярных выралеений. Регулярные вырюкения предиката я)п11аг определяются следующими синтаксическими правилами: гедц1ат ехргеяя)оп ::= тедц1ат тепп ! тедц1аг ехргеяя(оп чеггуса1 Ьаг гецц1аг тети гедц1ат гепп ::= тедц1аг 1асгог ~ тедц1ат гепп тедц1ат гассет тедц1ат (астот::= тедц1ат рт)пату ! тедц1аг ргппагу * тедц1ат ргыпагу « тедц1ат рт)вату ::= сЬатасгет ярес(1(ег з тедц1ат сЬатастег яет тедц1аг ехргеяя(оп сЬатастет ярес111ет ::= поп еясаре сЬатастет ~ еясаре сЬатастет гедц1ат сЬатастег яет 1ейт ЬтасКет сЬагастет епшпетатуоп 1(ят г(дит Ьгаскет 1е1т ЬтасЕет сЬатастет епшпегат(оп 11ят г1дЬт ЬтасАет 1ейт ЬгасЕет : тедц1аг сЬатяет Ы : г(дЬт Ьтасует сЬатастет епшпетат(оп ::= сЬатастет ярес111ет сЬатастег ярес111ет — сЬатастет ярес111ет тецц1аг сЬагяет Ы ::= А1 РНА ! ЦРРЕЕ ~ 10ХЕК ~ 0161Т ~ АТАПЗИ Поскольку в синтаксических правилах регулярных выражений символы « ~ », «(» и «)», используемые нами в качестве метасимволов в ВНР, являются терминальными символами, они изображены как чегтуса1 Ьат, 1егт Ьтасует и гудит Ьтаскет соответственно.
Создаваемое по приведенным правилам регулярное выражение представляет собой символьную строку, содержащую все символы, кото- 301 Основы баз данных Курс рые требуется явно сопоставлять с символами строки-источника. В строке могут находиться специальные символы, представляющие собой заменители обычных символов («Ъ» и «»), обозначения операций («)»), показатели числа возможных повторений («*» и ««») и т. д. При вычислении регулярного выражения образуются все возможные символьные строки, не содержащие специальных символов и соответствующие исходному шаблону. Тем самым, значением предиката я)я11аг является йие в том и только в том случае, когда среди всех символьных строк, генерируемых по регулярному выражению рая г.ягп са1ив, найдется символьная строка, совпадающая с яопгсе уа1ие.
Рассмотрим несколько примеров регулярных выражений. Выражение ' (тМя гя ягг)пц1) ) (тМя 1я ягг1пц2) ' производит две символьные строки: ' (тп)я Тя ягг1пц1) ' и ' (т)пя 1я ягг)пц2) '. В общем случае в круглых скобках могут находиться произвольные регулярные выражения гехр1 и гехр2. Результатом вычисления ' (гвхр1) ( (гехр2) ' является множество символьных строк, генерируемых выражением гехр1, объединенное с множеством символьных строк, генерируемых выражением гяхр2. Выражение 'ТМя 1я ягг)пд [12) *' генерирует символьные строки 'ТИя 1я ягг1пц ', 'Т)пя 1я ягг)пц 1', 'ТМя Тя ягг)пд 2', 'ТМя ая ягг1пц 11', 'Т)пя 1я ягг(пд 22', 'ТМя гя ягг1пц 12', 'ТЬ1я 1я ягг1пц 22', 'тп1я уя ягг1пц 111' и т д.Конструкция вквадратныхскобках представляет собой один из вариантов определения набора символов (геци1аг сйагасгег яег).
В данном случае символы, входящие в определяемый набор, просто перечисляются. При вычислении регулярного выражения в каждой из генерируемых символьных строк конструкция в квадратных скобках заменяется одним из символов соответствующего набора. Специальный символ «*», стоящий после закрывающей квадратной скобки, является показателем числа повторений.