Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы Данных - Сибилев, 2007

.pdf
Скачиваний:
290
Добавлен:
11.05.2015
Размер:
1.93 Mб
Скачать

131

(S[Ci]) UNION (P[Ci]);

(S[Ci]) INTERSECT (P[Ci]);

(S[Ci]) MINUS (P[Ci]);

(S RENAME Ci AS SCi) TIMES (P RENAME Ci AS Pci);

(SPJ[S#, P#]) DIVIDEBY (P[P#]);

объединение проекций;

пересечение проекций;

разность проекций;

расширенное прямое произведение;

реляционное деление;

(S JOIN SPJ)[Sn, Qt]; проекция объединения.

6.2.3 Примеры запросов на языке РА.

Сформулируем средствами РА несколько запросов к БД «Постав-

щик–Деталь–Изделие» (см. рис. ниже). В формулировках запросов исполь-

зуются имена столбцов таблиц БД, указанные на диаграмме в квадратных скобках.

 

ПОСТАВЩИК [S]

 

 

 

 

 

ДЕТАЛЬ [P]

 

 

номер поставщика

[S#]

 

 

 

 

номер детали

[P#]

 

название поставщика [Sn]

 

 

 

 

название детали [Pn]

 

статус

 

[St]

 

 

 

 

вес

 

[We]

 

 

 

 

 

 

цвет

 

[Co]

 

город размещения

[Ci]

 

 

 

 

 

 

 

 

 

 

город хранения [Ci]

 

 

 

 

 

 

 

 

 

 

 

 

 

выполнил

 

 

 

 

 

 

 

 

 

 

 

 

включена в

 

 

 

 

 

 

 

 

 

 

 

ИЗДЕЛИЕ [J]

 

 

 

 

ПОСТАВКА [SPJ]

 

 

 

 

 

номер поставщика [S#]

(FK)

номер изделия

[J#]

обеспечено

номер детали

[P#]

(FK)

название изделия

[Jn]

номер изделия

[J#]

(FK)

 

 

 

 

 

 

город производства [Ci]

 

 

 

количество

[Qt]

 

 

 

 

 

 

 

 

 

 

 

 

 

1) Получить полные сведения обо всех производимых изделиях.

J;

2) Получить номера и названия изделий, производимых в Томске.

(J WHERE Ci = ‘Томск’) [J#, Jn];6

3) Получить значения номеров поставщиков, выполняющих поставки для изделия J1.

(SPJ WHERE J# = ‘J1’)[S#];

6 Здесь и далее не нужные круглые скобки в формулировках запросов опускаются.

132

4) Получить значения номеров поставщиков, поставляющих деталь Р1

для изделия J1.

(SPJ WHERE J# = ‘J1’ AND P# = ‘P1’)[S#];

5) Получить значения наименований изделий, для которых выполня-

ет поставки поставщик S1.

(J JOIN (SPJ WHERE S# = ‘S1’))[Jn];

Другой возможный вариант формулировки:

(J[J#, Jn] JOIN (SPJ WHERE S# = ‘S1’)[J#])[Jn];

6) Получить значения цветов деталей поставляемых поставщиком S1.

(P JOIN (SPJ WHERE S# = ‘S1’))[Co];

7) Получить номера поставщиков, поставляющих детали для изделий

J1 и J2.

(SPJ WHERE J# = ‘J1’)[S#] INTERSECT (SPJ WHERE J# = ‘J2’)[S#];

8) Получить значения номеров поставщиков, поставляющих для из-

делия J1 красную деталь.

((SPJ WHERE J# = ‘J1’) JOIN (P WHERE Co = ‘красный’))[S#];

9)Получить значения номеров деталей, поставляемых для каждого изделия, производимого в Томске.

SPJ[P#, J#] DIVIDEBY (J WHERE Ci = ‘Томск’)[J#];

10)Получить значения номеров поставщиков, поставляющих крас-

ные детали для изделий, производимых в Томске или Яе.

((P WHERE Co = ‘красный’) JOIN SPJ JOIN (J WHERE Ci = ‘Томск

OR Ci = ‘Яя’))[S#];

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

(((J RENAME Ci AS JCi) JOIN SPJ JOIN (S RENAME Ci AS Sci))

WHERE NOT (JCi = SCi))[J#];

12) Получить значения номеров изделий, для которых не поставляет-

ся ни одной красной детали из Томска.

133

J[J#] MINUS ((P WHERE Co = ‘красный’ AND Ci = ‘Томск’)[P#]) JOIN

SPJ)[J#];

13) Получить имена поставщиков, поставляющих деталь Р2.

(( SPJ JOIN S) WHERE P# = ‘P2’) [Sn];

14)Получить имена поставщиков, поставляющих все детали.

(( SPJ[S#, P#] DIVIDEBY P[P#]) JOIN S) [Sn];

15)Получить имена поставщиков, поставляющих все поставляемые

детали.

(( SPJ[S#, P#] DIVIDEBY SPJ[P#]) JOIN S) [Sn];

Замечание. Нередко запросы бывают очень сложными, так что на-

писать одно реляционное выражение очень трудно. В таких случаях удоб-

но использовать оператор реляционного присваивания (:= ). С его помо-

щью предыдущий запрос можно записать так:

T1 := SPJ [S#, P#] ;

T2 := SPJ [P#];

T3 := T1 DIVIDEBY T2;

T4 := T3 JOIN S;

T5 := T4[Sn];

Здесь Ti понимаются как идентификаторы временных отношений,

создаваемых системой. Схема каждого Ti совпадает со схемой отношения,

произведенного выражением в правой части.

6.2.4 Дополнительные реляционные операции.

Определенные к настоящему моменту операции обеспечивают мани-

пуляции кортежами, но не дают никаких средств для работы со скалярами,

а это часто бывает необходимо.

Например, могут понадобиться сведения о весах поставок. Их мож-

но получить из отношения (SPJ JOIN P)[SPJ#, We, Qt], вычислив для каждого кортежа значение We*Qt. Однако имеющимися средствами

134

невозможно получить производное отношение со схемой {SPJ#, Tot_We}, где Tot_We принимает значения выражения We*Qt.

Это пример “горизонтальных вычислений”, т.е. комбинирования значений атрибутов из текущего кортежа отношения-операнда. В процессе анализа данных часто нужно комбинировать значения атрибута в различ-

ных кортежах – проводить «вертикальные» вычисления.

Например, для создания отчета о поставках может понадобиться от-

ношение, содержащее номера поставщиков, номера поставляемых ими де-

талей и общие объемы поставок этих деталей, выполненных этими по-

ставщиками. Чтобы получить такое отношение, нужно:

− сгруппировать кортежи отношения SPJ по значениям подмноже-

ства атрибута {S#, P#};

− сформировать отношение со схемой {S#, P#, Tot_Qt}, где Tot_Qt

принимает для каждого значения {S#, P#} единственное значение, равное сумме значений атрибута Qt во всех кортежах группы.

Определенные ниже операции производят отношения, содержащие результаты «горизонтальных» и «вертикальных» вычислений.

Операция расширения схемы. Это унарная операция. Она произво-

дит безымянное отношение со схемой, включающей все атрибуты операн-

да и, кроме того, атрибут, принимающий значения некоторого скалярного выражения. Операция обеспечивает возможность выполнения “горизон-

тальных вычислений”. Будем использовать для нее следующий синтаксис:

расширение ::= EXTEND терм ADD выражение AS атрибут;

Здесь выражение – любое скалярное выражение, ссылающееся на атрибуты терма.

Очевидны следующие ограничения:

1)схема терма не может содержать атрибута с именем, указанным после AS;

2)выражение не может ссылаться на атрибут.

Пример:

135

EXTEND (( P JOIN SPJ) ADD We*Qt AS Tot_We) [SPJ#, Tot_We];

Это выражение произведет безымянное отношение со схемой

{SPJ#, Tot_We}. Его кортежи будут содержать сведения о весах заре-

гистрированных поставок.

Операция подведения итогов. Это также унарная операция. Ее син-

таксис определим так:

подведение-итогов ::= SUMMARIZE терм BY (список) ADD

агрегатное-выражение AS атрибут;

Здесь список – список атрибутов, по которым производится груп-

пирование;

агрегатное-выражение – скалярное выражение, возвращающее единственное значение для группы кортежей;

атрибут – атрибут схемы производного отношения, определенный на значениях агрегатного-выражения.

Операция SUMMARIZE значительно сложнее операции EXTEND. По-

ясним ее действие. Пусть R – отношение со схемой, содержащей атрибуты

A1, A2, ..., An, по которым нужно подвести итог. Выражение

SUMMARIZE R BY (A1, A2, ..., An) ADD exp AS Z;

произведет безымянное отношение со схемой {A1, A2, ..., An, Z}. Тело этого отношения будет содержать все кортежи проекции отно-

шения R на атрибуты A1, A2, ..., An, дополненные значениями ат-

рибута Z. Значение атрибута Z в кортеже t производного отношения яв-

ляется значением выражения exp. Оно вычисляется на подмножестве всех таких кортежей отношения R, в которых значения атрибутов A1, A2,

..., An совпадают со значениями соответствующих атрибутов в t. Кон-

цептуально эту процедуру можно представить как формирование групп кортежей R с одинаковыми значениями атрибутов A1, A2, ..., An и

вычисление значения exp для каждой группы.

136

Выражение exp содержит ссылки на агрегатные функции, возвра-

щающие скалярные значения, вычисленные для группы кортежей операн-

да. Имеет смысл ввести такие агрегатные функции, которые выполняют

вычисления, часто встречающиеся при подведении итогов:

COUNT

число значений атрибута;

SUM

сумма значений атрибута;

AVG

среднее арифметическое значений атрибута;

MAX

максимальное значение атрибута;

MIN

минимальное значение атрибута.

Пример:

SUMMARIZE SPJ BY (S#, P#) SUM(Qt) AS Tot_Qt;

Это выражение производит отношение со схемой {S#, P#, Tot_Qt}. Тело отношения для каждой пары значений {S#, P#},

встретившейся в SPJ хотя бы один раз, будет содержать ровно один кор-

теж с соответствующими значениями номера поставщика, номера детали и суммарного объема поставок этой детали этим поставщиком независимо от того, для каких изделий и когда он поставлял этот вид детали.

6.2.5 Операторы обновления данных.

Для обновления данных в БД требуются операции вставки и удале-

ния кортежей и изменения значений атрибутов в существующих кортежах базовых отношений. Они не входят в состав операций РА. Мы приводим здесь синтаксис соответствующих операторов для того, чтобы показать,

как реляционные выражения можно использовать для определения области обновления данных.

Оператор вставки кортежей.

Синтаксис для оператора вставки кортежей определим так:

INSERT источник INTO приемник;

Здесь приемник и источник – любые реляционные выражения,

производящие отношения, совместимые по объединению.

137

Все кортежи источника вставляются в приемник.

Пример:

Пусть в схеме нашей БД определено отношение TEMP со схемой

{P#, TOTAL}. Оператор

INSERT ((SUMMARIZE SPJ BY (P#) SUM (Qt) AS TOTAL) WHERE TOTAL > 10000) INTO TEMP;

вставит в отношение TEMP все кортежи отношения, произведенного опе-

рацией SUMMARIZE.

Оператор обновления значений атрибутов. Синтаксис для этого оператора следующий:

UPDATE приемник список-присваиваний;

список-присваиваний ::= атрибут = скалярное-выражение | список-

присваиваний, атрибут = скалярное-выражение

Здесь приемник – любое реляционное выражение. Каждый атри-

бут из списка-присваиваний принадлежит приемнику.

Все кортежи приемника обновляются в соответствии с указанным

списком-присваиваний.

Пример:

UPDATE (S WHERE Ci = ‘Яя’) St := St 10;

Будут обновлены значения атрибута St во всех кортежах отношения

S, удовлетворяющих условию Ci = ‘Яя.

Оператор удаления кортежей. Оператор удаления кортежей имеет

вид:

DELETE приемник;

Здесь приемник – любое реляционное выражение.

Удаляются все кортежи целевого отношения, произведенного при-

емником.

Пример:

DELETE (S WHERE Ci = ‘Яя’);

138

Будут удалены все кортежи отношения S, содержащие сведения о поставщиках из Яи.

Реляционные выражения, встречающиеся в операторах INSERT, UPDATE, DELETE, определяют область действия этих операторов. Как правило, эти выражения оказываются либо именами базовых отношений,

либо подмножествами кортежей этих отношений. Однако, в принципе, они могут определять какую угодно часть БД.

Подчеркнем, что операции обновления действуют на уровне мно-

жеств кортежей. Даже когда обновляется один кортеж, на самом деле об-

новляется множество, состоящее из одного элемента. Иногда обновление одноэлементного множества невозможно.

Например, в нашей БД может существовать ограничение целостно-

сти: Все поставщики из Яи имеют одинаковые статусы”. Тогда опера-

ция

UPDATE (S WHERE S# = ’S1’) St := 50;

не может быть выполнена на уровне одного кортежа, если поставщик S1

размещается в Яе и есть еще поставщики из Яи. Такая операция должна быть либо преобразована системой в операцию

UPDATE (S WHERE Ci = ‘Яя’) St := 50;

обновляющую все кортежи, соответствующие поставщикам из Яи, либо отвергнута в соответствии с определенным правилом целостности.

6.2.6 Резюме.

РА замкнута относительно множества отношений. Всякое выражение РА производит отношение, следовательно, допустимо вложение выраже-

ний.

Выражения РА имеют процедурную интерпретацию. Подмножество данных, представленное выражением РА (запрос), может быть вычислено в

соответствии с определениями элементарных алгебраических операций, с

учетом их старшинства и возможных скобок.

139

РА есть средство записи выражений. Выражения РА могут использо-

ваться для определения области выборки, области обновления данных и других целей.

Все реляционные операции манипулируют данными на уровне мно-

жеств кортежей.

6.3 Реляционное исчисление

6.3.1 Алгебра и исчисление

Реляционное исчисление (РИ), как и реляционная алгебра, есть абст-

рактный язык манипулирования реляционными данными.

РА и РИ эквивалентны в том смысле, что для любого допустимого выражения РА можно построить формулу РИ, производящую такой же ре-

зультат, и наоборот. В связи с этим возникает вопрос: зачем включать в РМД и алгебру, и исчисление? Ответ кроется в разном уровне процедурно-

сти этих механизмов.

РА представляет в явном виде набор операций, которые можно ис-

пользовать для вычисления необходимого результата. Выражения реляци-

онной алгебры имеют процедурную интерпретацию. Они сообщают систе-

ме, как из базовых отношений построить требуемое производное отноше-

ние. Оно может быть вычислено в соответствии с определениями элемен-

тарных алгебраических операций, с учетом их старшинства и возможных скобок.

В отличие от РА, РИ есть просто система обозначений для определе-

ния производного отношения в терминах других отношений. Для формул РИ процедурной интерпретации нет. Они декларативны. Формула просто определяет условия, которым должны удовлетворять кортежи результи-

рующего отношения, – требуемые данные7.

Например, запрос: “Получить имена поставщиков, поставляющих деталь Р2” в терминах алгебры имеет вид:

7 Предполагается, что человеку легче сформулировать запрос к данным в терминах исчисления. Однако, на самом деле это не всегда так.

140

(( SPJ JOIN S) WHERE P# = ‘P2’)[Sn];

иописывает следующую процедуру:

построить естественное соединение SPJ и J по атрибуту S#;

выбрать из результата кортежи, в которых P# = ‘P2’;

выполнить проекцию результата на атрибут Sn.

Однако можно и не указывать, какие соединения, проекции и селек-

ции строить. Можно сформулировать на некотором формальном языке фразу следующего содержания:

Получить значения атрибута Sn для таких поставщиков, для ко-

торых в SPJ существуют кортежи с тем же значением атрибута S# и

со значением атрибута P# = ‘P2’.”

Подобной фразой можно точно указать системе характеристики ин-

тересующего нас отношения. Пусть она сама решает, какие вычисления нужно проделать для того, чтобы получить его.

Формальный язык для точной записи подобных высказываний назы-

вается реляционным исчислением. Его основой является исчисление пре-

дикатов первого порядка.

Современная РМД располагает двумя вариантами реляционных ис-

числений. В одном из них областями возможных значений переменных яв-

ляются отношения (РИ с переменными-кортежами), а в другом – домены

(РИ с переменными на доменах). Оба РИ, как и РА, обладают свойством замкнутости относительно множества отношений. То есть формулы РИ определяются над отношениями и интерпретируются как отношения. Это дает возможность строить вложенные формулы, выражая ими очень слож-

ные запросы к реляционной БД.

6.3.2 РИ с переменными-кортежами

Основным понятием этого варианта РИ является понятие перемен-

ной-кортежа.

Пусть R – некоторое отношение. Величина t, значениями которой