Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Реляционная_алгебра.doc
Скачиваний:
4
Добавлен:
22.11.2019
Размер:
2.61 Mб
Скачать

6. 6 Примеры

В этом разделе представлено несколько примеров использования реляционной алгебры для выражения словесных запросов в виде формулы. Читателю рекомендуется проверить их на примерных данных рис. 3.8.

Замечание. Каждый из этих операторов можно дополнить завершающим оператором присвоения и присвоить значение выражения какому-либо именованному отношению. Для краткости обычно этот шаг опускается.

6. 6. 1. Получить имена поставщиков, которые поставляют деталь р2

( ( SP JOIN S ) WHERE P# = ‘p2’ [SNAME]

Пояснение. Первое естественное соединение отношений SP и S осуществляется по номерам поставщиков и в результате дополняет (концептуально) каждый кортеж отношения SP соответствующей информацией поставщика (т. е. соответствующими значениями атрибутов SNAME, STATUS, CITY). Затем из этого соединения просто выбираются такие кортежи, в которых значение атрибута P# равно Р2. И наконец, выполняется проекция этой выборки по атрибуту SNAME. Конечный результат имеет единственный атрибут SNAME.

6. 6. 2. Получить имена поставщиков, которые поставляют по крайней мере одну красную деталь

( ( ( P WHERE COLOR = ‘Red’ ) [ S# ] JOIN S ) [ SNAME ]

И снова в результате получаем единственный атрибут SNAME.

Вот другая формулировка того же запроса:

( ( ( P WHERE COLOR = ‘Red’ ) [ P# ] JOIN S ) [ SNAME ]

Таким образом, это пример подчеркивает одно важное обстоятельство: возможность сформулировать один и тот же запрос несколькими способами. Некоторые следствия этой возможности обсуждаются далее в книге.

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

( ( SP [ S# , P# ] DIVIDEBY P [ P# ] JOIN S ) [ SNAME ]

И вновь в результате получаем единственный атрибут SNAME.

Замечание. Трактовать смысл этого выражения как «имена поставщиков, которые поставляют все детали» несколько некорректно. Смотрите объяснения в комментариях к [6.4].

6. 6. 4 Получить номера поставщиков, поставляющих по крайней мере все те детали, которые поставляет поставщик S2

SP [ S# , P# ] DIVIDEBY ( SP WHERE S# = ‘S2’ ) [ S# ]

В результате получаем единственный атрибут S#.

6. 6. 5. Получить все пары номеров поставщиков, размещенных в одном городе

( ( ( S RENAME S# AS FIRSTS# ) [ FIRSTS#, CITY ] JOIN

( S RENAME S# AS SECONDS# ) [ SECONDS# , CITY ] )

WHERE FIRSTS# < SECONDS# ) [ FIRSTS#, SECONDS# ]

В результате получаем отношение из двух атрибутов - FIRSTS# и SECONDS#. Конечно, достаточно было бы переименовать лишь один атрибут в одном из операндов соединения.

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

( ( S [ S # ] MINUS ( SP WHERE P# = ‘P2’ ) [S # ] )

JOIN S ) [SNAME]

В результате получаем единственный атрибут SNAME.

Разберем последний пример несколько подробнее, чтобы проиллюстрировать еще один момент. Не всегда просто представить себе, как выразить данный запрос в виде одной вложенной формулы (особенно если запрос сложный). Однако это и не обязательно. Вот пошаговое решение нашей проблемы:

T1 : = S [ S# ] ;

T2 : = SP WHERE P# = ‘P2’ ;

T3 : = T2 [ S# ] ;

T4 : = T1 MINUS T3 ;

T5 : = T4 JOIN S ;

T6 : = T5 [SNAME] ;

Отношение Т6 содержит необходимый результат.

Пояснение. Здесь знак ‘’ : =’’ означает оператор присвоения отношений (подробнее обсуждается ниже в этой главе). Для примера будем подразумевать, что имена отношений вида Ti используются системой для обращения к временным отношениям, которые автоматически создаются, когда им впервые присваиваются значения, и автоматически уничтожаются в некоторое подходящее время (например, в конце сеанса). Затем, если система включает возможность отсрочки вычислений (как, например, это делает система PRTV [6.8]), то разбиение запроса на последовательность небольших шагов таким способом не будет требовать абсолютно никаких нежелательных затрат производительности. Вместо этого весь запрос можно выполнить следующим образом.

  1. Предположим, что за приведенной последовательностью шагов следует запрос отображения на экран отношения Т6 (с помощью оператора DISPLAY нашего гипотетического языка). В запросе отображения на экран предполагается, что система не может отложить вычисление на какое-то время, а вместо этого должна как-то вычислить значение Т6.

  2. Для того чтобы вычислить значение Т6, которое является проекцией Т5 по атрибуту SNAME, система должна сначала вычислить значение Т5; чтобы вычислить значение Т5, которое является соединением Т4 и S. система должна сначала вычислить значение Т4 и т.д. Иными словами, система должна эффективно вычислять исходные вложенные выражения, точно так же, как пользователь, в первую очередь, должен эффективно писать такие вложенные запросы.

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