Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в базы данных. Корелина Т.В.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
2.67 Mб
Скачать

Операторы обновления

Реляционная модель кроме реляционной алгебры может включать также операции реляционного присвоения, имеющие следующий синтаксис:

target := source.

Вычисленное значение source присваивается отношению target, заменяя его старое значение. Операция присвоения дает возможность обновлять базу данных, однако она позволяет только полностью заменять значение отношения, поэтому используются более точные операции обновления, такие как INSERT, DELETE и UPDATE.

Оператор вставки INSERT

Синтаксис: INSERT source INTO target.

Пример: INSERT (S where CITY = ‘London’) INTO TEMP.

Оператор обновления UPDATE

Синтаксис: UPDATE target assignment-commalist,

где каждое присвоение assignment имеет вид attribute:=scalar-expression; target – реляционное выражение, а каждый атрибут attribute принадлежит отношению, которое является результатом вычисления указанного выражения. Все кортежи в результирующем отношении обновляются в соответствии с указанным оператором присвоения.

Пример: UPDATE P WHERE COLOR = ‘Red’ CITY := ‘Paris’.

Оператор удаления DELETE

Синтаксис: DELETE target.

Пример: DELETE S WHERE STATUS < 20.

7.4.2. Реляционное исчисление

Помимо реляционной алгебры для описания реляционных операций может быть использовано реляционное исчисление. Допустим, необходимо создать запрос: «Получить номера и города поставщиков, поставляющих деталь Р2». Алгебраическая версия этого запроса выглядит следующим образом:

  • преобразовать естественное соединение отношений S и P по атрибуту S#;

  • выбрать из результата этого соединения кортежи детали P2;

  • спроецировать результат этой выборки по атрибутам S# и CITY.

Формулировка этого запроса в терминах реляционного исчисления выглядит приблизительно так: «Получить атрибуты S# и CITY для таких поставщиков, для которых существует поставка в отношении SP с тем же значением атрибута S# и со значением P2 атрибута P#».

Во второй формулировке мы указываем лишь характеристики результирующего отношения, но ничего не говорим о способе его формирования. В этом случае система должна сама решить, какие операции и в каком порядке нужно выполнить над отношениями. Обычно говорят, что алгебраическая формулировка является процедурной, т.е. задающей правила выполнения запроса, а логическая – описательной (или декларативной), поскольку она всего лишь описывает свойства желаемого результата. На самом деле эти два механизма эквивалентны, и существуют не очень сложные правила преобразования одного формализма в другой.

Реляционное исчисление основано на исчислении предикатов.

Базисными понятиями исчисления являются понятие переменной с определенной для нее областью допустимых значений и понятие правильно построенной формулы, опирающейся на переменные, предикаты и кванторы. В зависимости от того, что является областью определения переменной, различаются исчисление кортежей и исчисление доменов. В исчислении кортежей областями определения переменных являются отношения базы данных, т.е. допустимым значением каждой переменной является кортеж некоторого отношения. В исчислении доменов областями определения переменных являются домены, на которых определены атрибуты отношений базы данных, т.е. допустимым значением каждой переменной является значение некоторого домена.

При использовании кортежных переменных в формулах можно ссылаться на значение атрибута переменной. Например, для того, чтобы сослаться на значение атрибута SNAME переменной SX, нужно употребить конструкцию SX.SNAME.

Синтаксис реляционного исчисления определяется с помощью грамматики в форме Бэкуса-Наура (БНФ) и имеет следующий вид:

range-variable-definition

::= RANGE OF variable IS range-item-commalist;

range-item

::= relation | expression

expression

::= (target-item-commalist) [WHERE wff]

target-item

::= variable | variable . attribute [AS attribute]

wff

::= condition

| NOT wff

| condition AND wff

| condition OR wff

| IF condition THEN wff

| EXISTS variable (wff)

| FORALL variable (wff)

| (wff)

где commalist – список элементов, разделенных запятыми;

relation - имя отношения, variable - имя переменной, attribute - имя атрибута;

condition (условие) – формула WFF, заключенная в скобки, или простое

скалярное сравнение;

wff (well-formulated formula) – правильно построенная формула.

Правильно построенные формулы (WFF) служат для выражения условий, накладываемых на кортежные переменные. Основой WFF являются простые сравнения, представляющие собой операции сравнения скалярных значений (значений атрибутов переменных или литерально заданных констант). Более сложные варианты WFF строятся с помощью логических связок NOT, AND, OR и IF ... THEN. Допускается также построение WFF с помощью кванторов  (EXIST) и  (FORALL).

Переменная кортежа определяется следующим образом:

RANGE OF T IS X1, X2, …, Xn,

где T – определяемая переменная кортежа, а Xi – либо имя отношения, либо выражение исчисления кортежей.

Пример: RANGE OF SX IS S.

Переменные, входящие в WFF, могут быть свободными или связанными. Все переменные, входящие в WFF, при построении которой не использовались кванторы, являются свободными. Если имя переменной использовано сразу после квантора при построении WFF, то это связанная переменная. Такая переменная не видна за пределами минимальной WFF, связавшей эту переменную. При вычислении значения такой WFF используется не одно значение связанной переменной, а вся ее область определения. Формула WFF, в которой все переменные связаны, называется закрытой формулой WFF. Открытая формула WFF – это такая формула, которая содержит по крайней мере одну свободную переменную.

WFF обеспечивают средства формулировки условия выборки из отношений БД. Чтобы можно было использовать исчисление для реальной работы с БД, требуется компонент, который определяет набор и имена столбцов результирующего отношения. Этот компонент называется целевым списком (target_item_commalist). Целевой список строится из целевых элементов, каждый из которых может иметь следующий вид:

•var.attr, где var - имя свободной переменной соответствующей WFF, а attr - имя атрибута отношения, на котором определена переменная var;

•var, что эквивалентно наличию подсписка var.attr1, var.attr2, ..., var.attrn, где attr1, attr2, ..., attrn, включает имена всех атрибутов определяющего отношения;

•new_name AS var.attr; new_name - новое имя соответствующего атрибута результирующего отношения.

Последний вариант требуется в тех случаях, когда в WFF используются несколько свободных переменных с одинаковой областью определения. Выражением реляционного исчисления кортежей называется конструкция вида target_item_commalist WHERE wff. Значением выражения является отношение, тело которого определяется WFF, а набор атрибутов и их имена – целевым списком.

Примеры:

1. Получить номера поставщиков из Парижа со статусом больше 20:

SX.S# WHERE SX.CITY = ‘Paris’ AND SX.STATUS > 20

2. Получить имена поставщиков, которые поставляют деталь P2:

SX. NAME WHERE EXISTS SPX ( SPX.S# = SX.S# AND SPX.P# = ‘P2’)

3. Получить имена поставщиков, которые поставляют по крайней мере одну деталь, поставляемую поставщиком S2:

SX.SNAME WHERE EXISTS SPX (EXISTS SPY (SX.S# = SPX.S# AND

SPX.P# = SPX.P# AND

SPY.S# = ‘S2’))

4. Получить имена поставщиков, которые поставляют все детали:

SX.SNAME WHERE FORALL PX (EXISTS SPX (SPX.S# = SX.S# AND

SPX.P# = PX.P))

5. Получить имена поставщиков, которые не поставляют деталь P2:

SX.SNAME WHERE NOT EXISTS SPX

(SPX.S# = SX.S# AND SPX.P# = ‘P2’)

6. Получить общее количество поставляемых деталей:

SUM (SPX, QTY) AS GRANDTOTAL)

Основным формальным отличием исчисления доменов от исчисления кортежей является наличие дополнительного набора предикатов, позволяющих выражать так называемые условия принадлежности. Если R - это n-арное отношение с атрибутами a1, a2, ..., an, то условие членства имеет вид R (ai1:vi1, ai2:vi2, ..., aim:vim) (m <= n), где vij - это либо литерально задаваемая константа, либо имя доменной переменной. Условие членства принимает значение true в том и только в том случае, если в отношении R существует кортеж, содержащий указанные значения указанных атрибутов. Если vij – константа, то на атрибут aij задается жесткое условие, не зависящее от текущих значений доменных переменных; если же vij – имя доменной переменной, то условие членства может принимать разные значения при разных значениях этой переменной.

Во всех остальных отношениях формулы и выражения исчисления доменов выглядят похожими на формулы и выражения исчисления кортежей.

Пример:

1. Получить номера поставщиков из Парижа со статусом больше 20:

SX WHERE EXISTS STATUSX

(STATUSX>20 AND S (S#:SX, STATUS:STATUSX, CITY:‘Paris’))

2. Получить имена поставщиков, которые поставляют, по крайней мере, одну деталь, поставляемую поставщиком S2:

NAMEX WHERE EXISTS SX EXISTS PX

(S (S#:SX, SNAME:NAMEX

AND SP (S#:SX, P#:PX)

AND SP (S#:’S2’, P#:PX)

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

NAMEX WHERE EXISTS SX (S (S#:SX, SNAME:NAMEX)

AND FORALL PX (IF P (P#:PX)

THEN SP (S#:SX, P#:PX)))

4. Получить имена поставщиков, которые не поставляют деталь P2:

NAMEX WHERE EXISTS SX (S (S#:SX, SNAME:NAMEX)

AND NOT SP (S#:SX, P:’P2’))

5. Получить номера деталей, которые или весят более 16 фунтов, или поставляются поставщиком S2, или и то и другое:

PX WHERE EXISTS WEIGHTX

(P (P#:PX, WEIGHT:WEIGHTX)

AND WEIGHTX>16)

OR SP (S#:’S2’, P#:PX)