Скачиваний:
180
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

6.5. Примеры

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

6.5.1. Получить имена поставщиков детали с номером 'р2'

( ( SP JOIN S } WHERE Pi = Pi ('P2') ) ) { SNAME }

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

6.5.2. Получить имена поставщиков по крайней мере одной красной детали

( ( ( Р WHERE COLOR = COLOR ( 'Red' ) )

JOIN SP ) { Si } JOIN S ) { SNAME }

И снова в результате получаем единственный атрибут SNAME. Вот другой вариант формулировки этого же запроса.

( ( ( Р WHERE COLOR = COLOR ( 'Red' ) ) { Pi }

JOIN SP ) JOIN S ) { SNAME }

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

6.5.3. Получить имена поставщиков всех типов деталей

( ( S { Si } DIVIDEBY Р { Pi } PER SP { Si, Pi } )

JOIN S) { SNAME )

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

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

S { Si } DIVIDEBY ( SP WHERE Si = SI ( 'S2' ) } { Pi }

PER SP { Si, Pi }

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

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

( ( { S RENAME Si AS SA J < SA, CITY } JOIN { S RENAME Si AS SB ) { SB, CITY } ) WHERE SA < SB ) { SA, SB }

В результате получаем отношение из двух атрибутов — SA и SB. Конечно, достаточно было бы переименовать лишь один атрибут в одном из операндов соединения. Мы пере- именовали оба атрибута для симметрии.

Замечание. Предполагается, что для типа Si определен оператор "<". Условие SA<SB необходимо по следующим двум причинам.

  • Чтобы исключить из результата пары номеров поставщиков вида (х, х)

  • Чтобы избежать наличия в результате одновременно двух пар вида (х, у) и (у, х)

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

WITH ( S RENAME Si AS SA ) { SA, CITY } AS Tl, ( S RENAME Si AS SB ) { SB, CITY } AS T2, Tl JOIN T2 AS T3 T3 WHERE SA < SB AS T4 : T4 { SA, SB }

Благодаря использованию предложения WITH громоздкие выражения можно записать в пошаговой форме, не нарушая при этом принципов непроцедурности реляционной ал- гебры. Мы продолжим обсуждение этого вопроса в следующем примере.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]