Модели и проектирование баз данных


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


.

Сформулируем средствами РА несколько запросов к БД «Поставщик–Деталь–Изделие» (см. рис. 2.3). В формулировках запросов ненужные круглые скобки будем опускать.

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

J;

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

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

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

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

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) Получить значения номеров изделий, для которых не поставляется ни одной красной детали из Томска.

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 совпадает со схемой отношения, произведенного выражением в правой части.



Содержание раздела