Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы Данных - Сибилев, 2007

.pdf
Скачиваний:
290
Добавлен:
11.05.2015
Размер:
1.93 Mб
Скачать

141

являются кортежи отношения 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.