Примеры запросов на языке РА
.
Сформулируем средствами РА несколько запросов к БД «Поставщик–Деталь–Изделие» (см. рис. 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 совпадает со схемой отношения, произведенного выражением в правой части.