С.Д. Кузнецов - Основы баз данных (1121716), страница 66
Текст из файла (страница 66)
условие х ссшр ор Аьь яимеетзначение 1а1зе в том и только в том случае, когда значение предиката х совр ор а равно майе хотя бы для одной строки а, входящей в я. В остальных случаях значение условия х совр ор АЬЬ я равно ип)гпоггп; БОВ Язык баз данных ЯОЫ предикеты раздела (К(НЕВЕ оператора ЗЕЬЕОТ Лекция 14 ° условие х совр ор НОМЕ Я имеет значение Гойе в том и только атом случае, когда Япусто, или значение условия х сокр ор з равно~айе для каждой строки з, входящей в Я. Условие х совр ор ЯОМЕ Я имеет значение оие в том и только в том случае, когда значение предиката х совр ор з равно (гие хотя бы для одной строки з, входящей в Я.
В остальных случаях значение условия х совр ор ЯОИЕ Я равно илклоип; ° УСЛОВИЕ х совр ор АИУ Яэквивалентно условию х совр ор ЯОИЕ Я. Примеры запросов с использованием предиката сравнения с квантором Пример 14.21. Найти номера служащих отдела номер 65, зарплата которых в этом отделе не является минимальной, ЯЕЬЕСТ ЕМР ИО РВОМ ЕМР ХНЕВЕ РЕРТ ИО = 65 АМО ЕМР ЯАЬ > ЯОМЕ (ЯЕЬЕСТ ЕМР1.ЕМР ЯАЬ РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР.ОЕРТ НО = ЕМР1.РЕРТ ИО(; Одна из возможных альтернативных формулировок этого запроса может основываться на использовании предиката ехтЯтЯ (пример 14.21а): ЯЕЬЕСТ ЕМР НО РВОМ ЕМР ХНЕВЕ ОЕРТ ИО = 65 АЫО ЕХ1ЯТЯ(ЯЕЬЕСТ * РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР.ОЕРТ НО = ЕМР1.ОЕРТ ИО АИР ЕМР.ЕМР ЯАЬ > ЕМР1.ЕМР ЯАЬ(; Вот альтернативная формулировка этого запроса, основанная на использовании агрегатной функции мьи (яример 14.21Ь): ЯЕЬЕСТ ЕМР ИО РВОМ ЕМР ХНЕВЕ ОЕРТ ИО = 65 АИО ЕМР ЯАЬ > (ЯЕЬЕСТ М1И(ЕМР1.ЕМР ЯАЬ( РВОМ ЕИР ЕМР1 хнеде емР.Оерт МО = еиР1.РеРТ НО(; Пример 14.22.
Найти номера и имена служащих отдела 65, однофа- мильцы которых работают в этом же отделе. 309 Основы баз данных к рс ЯЕЬЕСТ ЕМР МО, ЕМР МАМК КРОМ ЕМР ХНЕВЕ РЕРТ МО = 65 АМР ЕМР МАМЕ = ЯРМЕ (ЯЕЬЕСТ ЕМР1.ЕМР МАМЕ РВОМ ЕМР КМР1 ХНЕВЕ ЕМР.РЕРТ МО = ЕМР1.РЕРТ МО АМР ЕМР.ЕМР МО <> ЕМР1.ЕМР МО); Заметим, что эта формулировка эквивалентна следуюшей формулировке (пример 14.22а): ЯК(,ЕСТ ЕМР МО, ЕМР МАМЕ РВОМ ЕМР ХНЕВЕ РЕРТ МО = 65 АМР ЕМР МАМЕ 1М (ЯЕ1,ЕСТ РМР1.ЕМР МАМЕ РВОМ КМР ЕМР1 ХНЕВЕ ЕМР.РЕРТ МО = ЕМР1.РЕРТ МО АМР ЕМР.ЕМР МО <> ЕМР1.ЕМР МО); Возможна формулировка с использованием агрегатной функции СООМТ (пример 14.22й): ЯЕ1 ЕСТ ЕМР МО, ЕМР МАМЕ РВОМ ЕМР ХНЕВЕ РЕРТ МО = 65 АМР (ЯЕ1 ЕСТ СООМТ(в) РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР.РЕРТ МО = ЕМР1.РЕРТ МО АМР ЕМР.ЕМР МО <> ЕМР1.ЕМР МО ) >= 1; Наиболее лаконичным образом этот запрос можно сформулировать с использованием соединения (пример 14.22е): ЯЕЬЕСТ РТЯТТМСТ ЕМР.ЕМР МО, ЕМР.ЕМР МАМЕ РВОМ ЕМР, ЕМР ЕМР1 ХНЕВЕ ЕМР.РЕРТ МО = 65 АМР ЕМР.ЕМР МАМЕ = ЕМР1.ЕМР МАМЕ АМР КМР.РЕРТ МО = ЕМР1.РЕРТ МО АМР ЕМР.ЕМР МО <> ЕМР1.ЕМР МО; В последней формулировке мы вынуждены везде использовать уточненные имена столбцов, потому что на одном уровне используются два вхождения таблицы КМР.
310 Лекция 14 Язык баз данных ЯОЫ предикаты раздела %НЕВЕ операто а ЯЕсЕСТ Пример 14.23. Найти номера служащих отдела номер 65, зарплата которых в этом отделе является максимальной. ЯЕЬЕСТ ЕМР ИО РВОМ ЕМР ХНЕВЕ Г)ЕРТ ИО = б5 АИО ЕМР ЯА) >= АЬЬ(ЯЕККСТ ЕМР1.ЕМР ЯА1, РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР.РКРТ ИО = ЕМР1.РКРТ ИО); Одна из возможных альтернативных формулировок этого запроса может основываться на использовании предиката иот КХТЯтЯ (пример 14.23а): ЯК1,ВС'Г ЕМР ИО РВОМ ЕМР ХНЕВЕ РКРТ ИО = 65 АИО ИОТ ЕХТЯТЯ (ЯЕЬЕСТ * РВОМ ЕМР ЕМР1 ХНЕВЕ КМР.ОЕРТ ИО = ЕМР1.0ЕРТ ИО АИО ЕМР.ЕМР ЯАЬ < ЕМР1.ЕМР ЯАЫ; Можно сформулировать этот же запрос с использованием агрегатной функции МАХ (пример 14.23,в): ЯЕЬЕСТ ЕМР ИО РВОМ ЕМР ХНЕВЕ ОЕРТ ИО = б5 АИО ЕМР ЯАЬ = (ЯЕЬЕСТ МАХ(ЕМР1.ЕМР ЯА1) РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР.Г)ЕРТ ИО = ЕМР1.ОЕРТ ИО)' Пример 14.24.
Найти номера и имена служащих, не имеющих однофамильцев. ЯЕ) КСТ ЕМР ИО, ЕМР ХАМЕ РВОМ ЕМР ХНЕВЕ ЕМР МАМЕ <> А) Ь (ЯЕЬЕСТ ЕМР1.ЕМР ИАМЕ РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР1.ЕМР ИО <> ЕМР.ЕМР ИО); Згот запрос можно переформулировать на основе использования 311 Основы баа данных Курс предиката нот ех1ятЯ или агрегатной функции сООнт (по причине очевидности мы не приводим эти формулировки), но, в отличие от случая в примере 14.22с, формулировка в виде запроса с соединением здесь не проходит. Формулировка запроса ЯЕЬЕСТ Р1ЯТ1ИСТ ЕМР НО, ЕМР МАМЕ РРОМ ЕМР, ЕМР ЕМР1 ХНЕНЕ ЕМР.ЕМР МАМЕ <> ЕМР1.ЕМР МАМЕ АИР ЕМР1.ЕМР ИО <> ЕМР.ЕМР НО); эквивалентна формулировке ЯЕ1 ЕСТ ЕМР НО, ЕМР МАМЕ ЯНОМ ЕМР ИНЕССЕ ЕМР МАМЕ <> ЯОМЕ [ЯЕЬЕСТ ЕМР1.ЕМР МАМЕ РНОМ ЕМР ЕМР1 ИНЕСЕ ЕМР1.ЕМР НО <> ЕМР.ЕМР НО); Очевидно, что этот запрос является бессмысленным («Найти сотрудников, для которых имеется хотя бы один не однофамилец»), Предикат иаесЬ Предикат позволяет сформулировать условие соответствия строчного значения результату табличного подзапроса.
Синтаксис определяется следующим правилом: ваесЬ ргеЖсаее::= гон уа1ие сопясгссгог МАТСН ( 13Н1ООЕ ] ~ Я1МРЬЕ ~ РАНТ1АЬ ~ РП1 срзегу ехргеяя(оп Степень первого операнда должна совпадать со степенью таблицы-результата выражения запроса. Типы данных столбцов первого операнда должны быть совместимы с типами соответствующих столбцов табличного подзапроса. Сравнение пар соответствующих значений производится аналогично тому, как это специфицировалось для предиката сравнения.
Пусть х обозначает строку-первый операнд. Тогда: ° Если отсутствует спецификация вида сопоставления или специфицирован тип сопоставления я1МРЬЕ, то: ° если значение некоторого столбца х является неопределенным, то значением условия является йие; Язык оез данных 80Ы предикеты раздела т»НЕВЕ оператора БЕЬЕСТ Лекция 14 если в х нет неопределенных значений, то: и если не указано лпСце, и в результате выражения запроса существует (возможно„не уникальная) строка з в такая, что х = з, то значением условия является лтте; и если указано пнтСце, и в результате выражения запроса сушествует уникальная строка з, такая, что х = з, то значением условия является 1гие; и в противном случае значением условия является~а(м. в условии присутствует спецификация РАКТтАЬ, то: если все значения в х являются неопределенными, то значение условия есть !гие; иначе: и если не указано 'нтбуе, и в результате выражения запроса существует (возможно, не уникальная) строка з, такая, что каждое отличное от неопределенного значение х равно соответствующему значению з, то значение условия естыгие; и ЕСЛИ уКаЗаНО 1дцССЕ, И В рЕЗуЛЬтатЕ ВЫражЕНИя ЗаПрОСа СущЕ- ствует уникальная строка з, такая, что каждое отличное от неопределенного значение х равно соответствующему значению з, то значение условия естыгие; и в противном случае значение условия есть|а!и.
в условии присутствует спецификация Яцько, то: если все значения в х неопределенные, то значение условия есть !где; ° Если ° Если ° если ни одно значение в х не является неопределенным, то: и если не указано витые, и в результате выражения запроса существует (возможно, не уникальная) строка з, такая, что х = з, то значение условия есть лт«е; и если указано иртСпе, и в результате выражения запроса существует уникальная строка з, такая, что х = з, то значение условия есть !где; и в противном случае значение условия есть(д(зе.
° в противном случае значение условия есть гд!зе. Примеры запросов с использованием предиката ее есд 313 Все прил1еры этого пункта основаны на запросе «Найти номера служащих и номера их отделов для служащих, для которых в отделе со «схожим» номером работает служащий со «схожей» датой рождения» с некоторыми уточнениями. Куро Основы баз данных Пример 14.25. НЕКЕСТ ЕМР ИО, КЕРТ ИО РВОМ ЕМР ХНЕВЕ (ЭЕРТ НО, ЕМР НРАТЕ) МАТСН К1МРБЕ )БЕНЕТ КМР1.КЕРТ НО, ЕМР1.ЕМР ВРАТЕ РВОМ ЕМР ЕМР1 ХНЕВЕ ЕМР1.ЕМР ИО <> ЕМР.КМР ИО); Этот запрос вернет данные о служащих, про которых: ° либо неизвестны номер отдела или дата рождения (или и то, н другое); ° либо в отделе данного служащего работает по крайней мере еще один человек с той же датой рождения. Если использовать предикат НАтсн ОМ1ООЕ кгмРЕЕ, то мы получим данные о служащих, про которых: ° либо неизвестны номер отдела или дата рождения (или и то, и другое); ° либо в отделе данного служащего работает еще один человек с той же датой рождения.
Пример 14.26. ЕККЕСТ ЕМР НО, РКРТ ИО РВОМ ЕМР ХНЕВК )ОЕРТ ИО, ЕМР ВРАТЕ) МАТСН РАВТ1АК (ЕЕ1 ЕСТ ЕМР1.РКРТ ИО, ЕМР1.ЕМР ВРАТЕ РВОМ ЕМР КМР1 ХНЕВЕ ЕМР1.КМР ИО <> ЕМР.ЕМР ИО); Этот запрос вернет данные о служащих, про которых: ° либо неизвестны номер отдела и дата рождения; ° либо неизвестен номер отдела, но имеется по крайней мере еще один человек с той же датой рождения; ° либо неизвестна дата рождения, но в отделе данного служащего работает по крайней мере еще один человек; ° либо известны и номер отдела, и дата рождения, и в отделе данного служащего работает по крайней мере еще один человек с той же датой рождения.
Если использовать предикат МАТСН НН10ОЕ РАВТ1АК, то мы получим данные о служащих, про которых: ° либо неизвестны номер отдела и дата рождения; ° либо неизвестен номер отдела, но имеется еще один человек с той же датой рождения; 314 Лекция 14 Язык баз данных ВОЫ предикаты раздела )МНЕЯЕ оператора ВЕкЕСТ ° либо неизвестна дата рождения, но в отделе данного служащего работает еще один человек; ° либо известны и номер отдела, и дата рождения, и в отделе данного служащего работает еще один человек с той же датой рождения.