Примеры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: