UNION|INТERSECT|MINUS|TIМES|JOIN|DIVIDEBY

По приведенной грамматике можно сделать следующие замечания.

1) Реляционные операторы UNION, INTERSECT и MINUS требуют, чтобы отношения были совместимыми по типу, т. е. имели идентичные заголовки.

2) Легко проверить, что операторы UNION, INTERSECT, TIMESи JOINассоциативны и коммутативны.

3) Если отношения A и B не имеют общих атрибутов, то операция соединения A JOIN Bэквивалентна операции A TIMES B, т. е. в таком случае соединение вырождается в декартово произведение. Такое соединение называют естественным.

4) Другой допустимый синтаксис для синтаксической категории переименования таков:

( терм RENAМE список-переименований ). Здесь каждый из элементов списка переименований представляет собой выражение имя_атрибута AS имя_атрибута.

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

 

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

 

Оператор естественного соединения по атрибуту Y определяется через оператор декартового произведения и оператор ограничения:

 

A JOIN B = ((A TIMES (B RENAME Y AS Y1)) WHERE Y=Y1)[X, Y, Z]

 

Оператор пересечения выражается через вычитание следующим образом:

 

A INTERSECT B = A MINUS (A MINUS B)

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

 

A DIVIDEBY B = A[X] MINUS ((A[X] TIMES B) MINUS A)[X]

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

 

В качестве примера рассмотрим запросы на языке реляционной алгебры для схемы базы данных «Поставщики и детали», представленной следующими схемами отношений:

 

S(Sno: integer, Sname: string, Status: integer, City: string)

P(Pno: integer, Pname: string, Color: string, Weight: real, City: string)

SP(Sno: integer, Pno: integer, Qty: integer)

 

В данном примере имена доменов представлены именами типов, имена типов отделяются от имен атрибутов двоеточием, первичные ключи выделены подчеркиванием, а имена внешних ключей схемы отношения SP (ПОСТАВКА) совпадают с именами первичных ключей схем отношений S (ПОСТАВЩИК) и P (ДЕТАЛЬ).

 

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

 

( ( SP JOIN S ) WНEPE Рno = 2 ) [ Sname ]

 

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

 

( ( ( Р WНERE Color = 'Красный' ) JOIN SP) [ Sno ] JOIN S ) [ Sname ]

 

Другая формулировка того же запроса:

 

( ( ( Р WНERE Color = 'Красный' ) [ Рno ] JOIN SP ) JOIN S ) [ Sname ]

 

Этот пример подчеркивает одно важное обстоятельство: возможность сформулировать один и тот же запрос несколькими способами.

 

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

 

( ( SP [ Sno, Рno] DIVIDE BY Р [ Рno ] JOIN S ) [ Sname ]

 

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

 

SP [ Sno, Рno ] DIVIDE ВY ( SP WНEPE Sno = 2 ) [ Рno ]

 

5) Получить все пары номеров поставщиков, размещенных в одном городе

 

( ( ( S RENAМE Sno AS FirstSno ) [ FirstSno, City ] JOIN

( S RENAМE Sno AS SecondSno ) [ SecondSno , City ] )

WНEPE FirstSno < SecondSno ) [ FirstSno, SecondSno ]

 

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

 

((S[ Sno ] MINUS (SP WНEPE Рno = 2 ) [ Sno ] ) JOIN S ) [Sname]

 

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

 

Реляционное исчисление основано на разделе математической логики, который называется исчислением предикатов. Реляционное исчисление существует в двух формах: исчисление кортежей и исчисление доменов. Основное различие между ними состоит в том, что переменные исчисления кортежей яв­ляются переменными кортежей (они изменяются на отношении, а их значения являются кортежами), в то время как переменные исчисления доменов являются переменными доменов (они изменяются на доменах, а их значения являются скалярами).

 

Упрощенный синтаксис выражений исчисления кортежей в форме БНФ имеет вид.

 

объявление-кортежной-переменной ::=

RANGE OF переменная IS список-областей

область ::=

отношение |

реляционное-выражение

реляционное-выражение ::=

(список-целевых-элементов)[WHERE wff]

целевой-элемент ::=

переменная |

переменная.атрибут [AS атрибут]

wff ::=

условие |

NOT wff |

условие AND wff |

условие OR wff |

IF условиеTHEN wff |

EXISTS переменная (wff) |

FORALL переменная (wff) |

(wff)

условие ::=

(wff) |

компаранд операция-отношения компаранд

 

По приведенной грамматике можно сделать следующие замечания.

1) Квадратные скобки здесь указывают на компоненты, которые по умолчанию могут быть опущены.

2) Категории отношение, атрибут и переменная – это идентификаторы (т. е. имена).

3) Реляционное выражение содержит заключенный в скобки список целевых элементов и выражение WHERE, содержащее формулу wff («правильно построенную формулу»). Такая формула wff составляется из кванторов (EXISTS и FORALL), свободных и связанных переменных, констант, операторов сравнения, логических (булевых) опе­раторов и скобок. Каждая свободная переменная, которая встречается в формуле wff, должна быть также перечислена в списке целевых элементов.

4) Категория условие представляет или формулу wff, заключенную в скобки, или простое скалярное сравнение, где каждый компаранд оператора сравнения – это либо скалярная константа, либо значение атрибута в форме переменная.атрибут.

 

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

 

RANGE OF T IS R1, R2, ..., Rn

 

Тогда отношения R1, R2, ..., Rn должны быть совместимы по типу т. е. они должны иметь идентичные заголовки, и кортежная переменная T изменяется на объединении этих отношений, т. е. её значение в любое заданное время будет некоторым текущим кортежем, по крайней мере одного из этих отношений.

 

Примеры объявлений кортежных переменных.

 

RANGE OF SX IS S

RANGE OF SPX IS SP