Базы Данных - Сибилев, 2007
.pdf141
являются кортежи отношения R, называется переменной-кортежем, опре-
деленной на R.
На интуитивном уровне переменная-кортеж это перемещающееся по строкам таблицы окно, в котором всегда видна одна строка – текущее зна-
чение переменной.
Синтаксис исчисления. Для записи выражения РИ кортежей нужно указать области определения переменных, определить схему целевого от-
ношения и сформулировать условия, которым должны удовлетворять кор-
тежи его тела.
область-определения ::= RANGE OF переменная IS список-
элементов-области;
выражение ::= (список-целевых-элементов) [WHERE ппф] ;
целевой-элемент ::= переменная | переменная.атрибут [AS атри-
бут];
ппф ::= условие | NOT ппф | условие AND ппф | условие OR ппф | IF условие THEN ппф | EXISTS переменная (ппф) | FOR ALL
переменная (ппф) | (ппф);
условие ::= (ппф) | сравнение;
сравнение ::= символ θ символ;
символ ::= переменная.атрибут | константа;
θ :: = < | > | = | <>;
Здесь отношение, переменная, атрибут - идентификаторы;
список – список элементов, разделенных запятыми, ппф – правильно по-
строенная формула исчисления. Квадратные скобки показывают, что за-
ключенные в них компоненты могут быть опущены.
Область определения. Переменная-кортеж t определяется фразой:
RANGE OF t IS X1, X2, …, Xn;
где t– имя переменной-кортежа;
Xi – имя отношения или выражение исчисления кортежей.
142
Все Xi должны быть совместимы по объединению. Переменная t
принимает значение на объединении X1 X2 … Xn.
Обычно список элементов области определения – это одно отноше-
ние. Например, предложение
RANGE OF SX IS S;
указывает область определения переменной SX – отношение S.
Вот более сложный случай.
RANGE OF SPJX IS SPJ;
RANGE OF SY IS (SX) WHERE SX.Ci = ‘Яя’, (SX) WHERE
EXISTS SPJX (SPJX.S# = SX.S#
AND SPJX.P# = ‘P1’);
Переменная SY принимает значения на множестве кортежей отно-
шения S, относящихся к поставщикам, расположенным в Яе или постав-
ляющим деталь Р1.
Список целевых элементов. Каждый целевой элемент – это или имя переменной-кортежа, или выражение вида
t.A [ AS X ],
где t – имя переменной-кортежа;
А – имя атрибута сопоставляемого отношения;
Х – новое имя атрибута А, используемое в ссылках на атрибут пере-
менной-кортежа t.
Сопоставляемое отношение – это область определения переменной t, то есть, отношение являющееся объединением элементов-области.
В вышеприведенном примере сопоставляемое отношение есть объе-
динение отношений
(SX) WHERE SX. Ci = ‘Яя’;
и
(SX) WHERE EXISTS SPJX
143
(SPJX. S# = SX. S# AND SPJX. P# = ‘P1’);
Примеры целевых списков:
SX.S#, SX.Sn;
SX.Ci AS SCity;
SX.S#, SX.Ci AS SCity, PX.P#, PX.Ci AS Pcity;
Список целевых элементов не имеет смысла вне выражения исчис-
ления.
Целевой список определяет схему целевого отношения. Имена атри-
бутов (и, соответственно, домены) наследуются от схемы сопоставляемого отношения либо указываются явно необязательной конструкцией “AS
атрибут”.
Правильно построенные формулы (ППФ). Как видно из определе-
ния, ППФ – это предикат первого порядка.
Примеры простых предикатов:
SX.S# = SPJX.S#;
SX.S# = ‘S1’;
SX.S# = SPJX.S# AND SPJX.P# = ‘P1’;
NOT (SX.Ci = ‘Яя’);
IF SX.Ci = ‘Яя’ THEN SPJX.S# = ‘S1’;
Последний предикат – пример намеренно бессмысленного, но син-
таксически правильного высказывания.
Правильно построенная формула может содержать кванторы
EXISTS (существует) и FORALL (для всякого).
Выражение EXISTS SX (SX.Ci = ‘Яя’) может быть прочи-
тано так: “Существует в области определения переменной SX кортеж со значением атрибута Ci равным ‘Яя’”. Предикат принимает значение
.T., если в текущем значении отношения S есть хотя бы один кортеж со
значением Ci = ‘Яя’.
144
Вообще говоря, если R – некоторое отношение, t – переменная, оп-
ределенная на R, |
t1, t2, …, |
tn – значения t (кортежи R), a f(t) – |
|||
ППФ, то формула |
EXISTS |
t (f(t)) равносильна бескванторной |
|||
формуле .F. OR f(t1) |
OR |
f(t2) OR … |
OR f(tn). |
||
Выражение FORALL |
SX |
(SX. Ci |
= |
‘Яя’) может быть про- |
|
читано так: “В каждом кортеже отношения |
S значение атрибута Ci |
равно ‘Яя’”.
В предыдущих обозначениях формула FORALL t (f(t)) равно-
сильна бескванторной формуле .Т. AND f(t1) AND f(t2) AND … AND f(tn). Очевидно, FORALL t (f(t)) равносильно NOT EXISTS
t (NOT (f(t)).
Переменная t, входящая в ППФ, называется связанной или свобод-
ной в зависимости от того, действует ли на формулу квантор по t.
Примеры:
f(t) – переменная t свободная;
f(t, q) – переменные t и q свободные;
EXISTS t (f(t, q)) – переменная t связанная, q – свобод-
ная;
FORALL t (f(t)) AND g(t) - первое вхождение t – связан-
ное, второе – свободное.
В последней формуле одним и тем же символом t обозначены раз-
ные переменные, возможно, определенные на одной и той же области. В
первой подформуле можно изменить имя переменной, не меняя смысла
высказывания и значения предиката. Переменная служит здесь лишь для связи внутренних параметров предиката f( ) с внешним квантором.
Второе вхождение переменной t имеет совершенно иной смысл. Здесь g(t) принимает то или иное значение в зависимости от значения пере-
менной t. Заменить t на x, например, здесь нельзя, поскольку х и t мо-
145
гут принимать различные значения. Связанная переменная подобна ло-
кальной переменной в языках программирования.
Формула, в которой все переменные связаны, называется закрытой.
Например, FORALL x (EXISTS y (f(x, y))) – закрытая формула.
Формула, содержащая по крайней мере одну свободную переменную, на-
зывается открытой.
Примеры запросов. Здесь приведены формулы РИ кортежей, эквива-
лентные выражениям РА для ранее рассмотренных примеров. Номера формул соответствуют номерам запросов.
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#));
146
Другая формулировка этого запроса, не использующая квантора все-
общности:
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#));
6.3.3 Реляционное исчисление с переменными на доменах
В этом варианте РИ используются скалярные переменные, прини-
мающие значения на доменах.
Условие принадлежности. Основное отличие синтаксиса РИ доме-
нов от определенного выше состоит в том, что здесь используется специ-
альная синтаксическая конструкция – условие принадлежности:
отношение (пара, пара, …),
пара ::= атрибут : символ,
символ ::= переменная | литерал.
Здесь отношение и переменная – идентификаторы.
147
Условие принадлежности принимает значение “истина”, если и толь-
ко если в отношении существует кортеж, в котором указанные атрибуты принимают указанные значения.
Примеры.
Условие S(S#:‘S1’) примет значение .T., если и только если в текущем значении отношения S существует кортеж со значением атрибута
S#, равным S1.
Условие SPJ(S#:SX, P#:PX) принимает значение .T., если и только если в SPJ есть кортеж, в котором значения S# и P# совпадают с текущими значениями переменных SX и PX, определенных на доменах S#
иP#.
Примеры запросов. Здесь приведены формулы РИ доменов, эквива-
лентные выражениям РА из некоторых примеров, приведённых выше. Но-
мера формул соответствуют номерам запросов.
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’);
Заметьте, что (в отличие от формулы исчисления кортежей) здесь не
нужен квантор существования.
148
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));
Сравните эти формулировки с приведенными выше.
6.3.4 Резюме
Все три механизма манипулирования данными составляют основу реализаций реляционных ЯМД. Это непроцедурные языки. Они не предна-
значены для записи алгоритмов. Они предназначены для точного форму-
лирования запросов к данным.
Самый распространенный язык запросов SQL основывается на смеси алгебраических и логических конструкций. Человек формулирует запрос в виде предиката, а система строит соответствующую процедуру вычисле-
ния требуемого результата.
149
7 ЯЗЫК ДАННЫХ SQL
7.1 Обзор основных понятий SQL
7.1.1 Назначение и этапы развития
Язык РБД SQL (Structured Query Language) предназначен для опре-
деления ресурсов данных, манипулирования данными и управления досту-
пом к данным на концептуальном уровне. SQL не является языком про-
граммирования и не содержит никаких процедурных средств. Строго гово-
ря, это подъязык данных.
Первая версия SQL была разработана фирмой IBM в начале 70-х го-
дов8 и использовалась в качестве входного языка экспериментальной СУБД System-R. Описание языка было впервые опубликовано в 1974 году.
К середине 80-х годов многие производители коммерческих СУБД созда-
ли свои реализации SQL. Во избежание «вавилонского смешения языков»
вмире реляционных СУБД Международная Организация Стандартизации и Американский Национальный Институт Стандартов (ISO/ANSI) приняли
в1986 году первый стандарт SQL1. В 1989 году этот стандарт был пере-
смотрен. Сейчас на него ссылаются как на SQL1 или SQL-89. В 1992 году принят новый стандарт, известный ныне под названиями SQL2, SQL-92, SQL/92. Распространенные в настоящее время коммерческие СУБД, за ис-
ключением наиболее «продвинутых», ориентированы на стандарт SQL1.
Мы при изложении возможностей языка будем в основном придерживать-
ся требований SQL2, т.к. этот стандарт практически полностью включает
SQL1 и является основой для перспективных разработок.
Следует иметь в виду, что стандарты SQL, равно как и прочие стан-
дарты в области программного обеспечения, носят рекомендательный ха-
рактер. Производители программных продуктов могут не придерживаться их требований. Тем не менее, знакомство со стандартами необходимо, так как они определяют общие свойства всех реализаций и согласованные
8 Она называлась SEQUEL (Structured English Query Language).
150
представления разработчиков СУБД о системных требованиях и перспек-
тивах развития. Для практического использования SQL в конкретной среде разработки необходимо изучить поддерживаемую средой версию языка по технической документации.
Язык является компромиссом между теоретическими положениями реляционной модели данных (РМД) и практикой использования баз дан-
ных. Поэтому его конструкции лишь частично соответствуют требованиям РМД. Например, стандарт не поддерживает реляционные домены, допус-
кает определение таблицы без первичного ключа и содержит ряд других отклонений от РМД. Однако в настоящее время не существует другого входного языка «реляционных» СУБД.
7.1.2 Реализации
Стандарт предусматривает использование языка в виде трех при-
кладных реализаций – интерактивной, статической и динамической (рис
7.1).
Интерактивный SQL дает возможность пользователю работать с базой данных в интерактивном режиме. Вводимые пользователем команды
SQL немедленно исполняются.
Статический SQL – записанный заранее код SQL, используемый в прикладных программах. Предусмотрены две версии статического SQL.
SQL
Интерактивный Статический Динамический
Встроенный Модульный
Рис. 7.1 Варианты прикладных реализаций SQL
− Встроенный SQL – код SQL, включённый в код исходного текста прикладной программы на одном из ЯВУ. Эта версия является расширением базового ЯВУ за счет операторов SQL.