Примеры запросов
. Здесь приведены формулы РИ кортежей, эквивалентные выражениям РА из примеров п. 2.5.4. Номера формул соответствуют номерам запросов.
1) RANGE OF JX IS J;
JX;
Далее для упрощения записи будем считать, что переменные SX, PX, JX, SPJX определены на отношениях S, P, J, SPJ, соответственно. Если понадобится определить на отношении более одной переменной, будем расширять имя отношения другими буквами, например, SY, SZ… Ненужные скобки будем опускать.
2) (JX.J#, JX.Jn) WHERE Ci = ‘Томск’;
3) SPJX.S# WHERE J# = ‘J1’;
4) SPJX.S# WHERE J# = ‘J1’ AND P# = ‘P1’;
5) JX.Jn WHERE EXISTS SPJX
(SPJX.S# = ‘S1’ AND SPJX.J# = JX.J#);
6) PX.Co WHERE EXISTS SPJX
(SPJX.S# = ‘S1’ AND SPJX.P# = PX.P#);
7) SPJX.S# WHERE J# = ‘J1’ AND EXISTS SPJY
(SPJY.S# = SPJX.S# AND J# = ‘J2’);
8) SPJX.S# WHERE SPJX.J# = ‘J1’ AND EXISTS PX
(PX.P# = SPJX.P# AND PX.Co = ‘красный’);
9) SPJX.P# WHERE FORALL JX
(IF JX.Ci = ‘Томск’ THEN EXISTS SPJY
(SPJY.J# = JX.J# AND SPJY.P# = SPJX.P#));
Другая формулировка этого запроса, не использующая квантора всеобщности:
SPJX.P# WHERE NOT EXISTS JX
(JX.Ci = ‘Томск’ AND NOT EXISTS SPJY
(SPJY.J# = JX.J# AND SPJY.P# = SPJX.P#));
10) SPJX.S# WHERE EXISTS PX
(PX.Co = ‘красный’ AND PX.P# = SPJX.P#) AND
EXISTS JX (JX.J# = SPJX.J# AND
(JX.Ci = ‘Томск’ OR JX.Ci = ‘Яя’));
11) JX.J# WHERE EXISTS SPJX EXISTS SX
(JX.J# = SPJX.J# AND SX.S# =SPJX.S# AND
NOT (JX.Ci = SX.Ci) );
12) JX.J# WHERE NOT EXISTS SPJX EXISTS PX
(SPJX.P# = PX.P# AND PX.Ci = ‘Томск’ AND
PX.Co = ‘красный’ AND SPJX.J# = JX.J#);
13) SX.Sn WHERE EXISTS SPJX
(SPJX.P# = ‘P2’ AND SPJX.S# = SX.S#);
14) SX.Sn WHERE FORALL PX (EXISTS SPJX
(PX.P# = SPJX.P# AND SPJX.S# = SX.S#));
. Здесь приведены формулы РИ доменов, эквивалентные выражениям РА из некоторых примеров п. 2.5.4. Номера формул соответствуют номерам запросов.
1) RANGE OF JX IS J#;
RANGE OF JnX IS Jn;
RANGE OF CiX IS Ci;
(JX, JnX, CiX) WHERE J(J# : JX, Jn : JnX, Ci : CiX);
Далее будем опускать определения переменных.
2) (JX, JnX) WHERE
J(J# : JX, Jn : JnX, Ci : ‘Томск’);
3) SX WHERE SPJ(J# : ‘J1’);
4) SX WHERE SPJ(J# : ‘J1’, P# = ‘P1’);
5) JnX WHERE EXISTS JX (SPJ (S# : ‘S1’, J# : JX)
AND J(J# : JX, Jn : JnX));
6) CoX WHERE EXISTS PX
(SPJ(S# : ‘S1’, P# : PX) AND
P(P# : PX, Co : CoX));
7) SX WHERE SPJ(S# : SX, J# : ‘J1’) AND
SPJ(S# : SX, J# : ‘J2’);
Заметьте, что (в отличие от формулы исчисления кортежей) здесь не нужен квантор существования.
8) SX WHERE EXISTS PX
(SPJ(S# : SX, P# : PX, J# : ‘J1’) AND
P(P# : PX, Co : ‘красный’));
9) PX WHERE FORALL JX (IF J(J# : JX, Ci : ‘Томск’) THEN SPJ(P# : PX, J# : JX));
Другая формулировка этого запроса, не использующая квантора всеобщности:
PX WHERE NOT EXISTS JX (J(J# : JX, Ci : ‘Томск’) AND NOT SPJ(P# : PX, J# : JX));
Сравните эти формулировки с приведенными в пп. 2.5.4, 2.6.2. Большое количество задач такого типа приведено в [1], [7].
2.6.4 Резюме. Все три механизма манипулирования данными составляют основу реализаций реляционных ЯМД. Это непроцедурные языки. Они не предназначены для записи алгоритмов. Они предназначены для точного формулирования запросов к данным.
Самый распространенный язык запросов SQL основывается на смеси алгебраических и логических конструкций. Человек формулирует запрос в виде предиката, а система строит соответствующую процедуру вычисления требуемого результата.