1.4 Реляционные выражения
Поскольку результатом любой РО является некоторая таблица, можно составлять реляционные выражения. Для этого вместо таблицы–операнда некоторой РО (кроме операции присваивания) можно использовать вложенное реляционное выражение. Например, запрос, представленный на языке РА, может быть вычислен на основе вычисления элементарных алгебраических операций с учетом их старшинства и возможного наличия скобок. Алгебраическая формулировка запроса носит предписывающий характер, т. е. описывает процедуру решения проблемы. Поэтому считают, что, подобно тому, как интерпретируются арифметические и логические выражения, выражение РА также имеет процедурную интерпретацию.
Пусть требуется представить в БД сущность Группа с основными свойствами (обозначение группы или ее код, специальность, год набора, староста группы и набор студентов группы). Для каждого студента нужно хранить следующую информацию:
код студента;
ФИО студента;
стипендия.
При правильном проектировании БД в ней появятся две РТ: тГруппы и тСтуденты. Отразим в названии полей их назначение, при этом для удобства названия полей тГруппы будут начинаться с сочетания букв Гр, а поля тСтуденты – с букв Ст_. Таким образом структуры РТ могут иметь следующий вид:
тГруппы (*Гр_код, Гр_год,Гр_спец, Гр_староста);
тСтуденты (*Ст_код, Ст_ФИО, Ст_стип, Ст_гр_код).
Первичные ключи в РТ показаны знаком звездочки (*).
Допустим, нужно узнать коды и ФИО студентов, являющихся старостами групп, набранных в 2000 году.
Если бы для формулировки такого запроса использовать РА, то мы получили бы следующее пошаговое решение в виде алгебраических выражений:
выполняется соединение исходных РТ по условию (код студента должен быть равным коду старосты)
Т1:=(тСтуденты TIMES тГруппы) WHERE Ст_код = Гр_стар;
полученная в п.1 РТ Т1 ограничивается по условию (по заданному году набора)
Т2:=Т1 WHERE Гр_год=2000;
результат предыдущей операции проецируется на искомые поля
Т3:=Т2 [Ст_ФИО, Ст_код ].
Фактически сформулирована последовательность шагов выполнения запроса, каждый из которых соответствует одной реляционной операции. Таблица Т3 содержит искомый результат.
Можно объединить все шаги в один и выразить запрос в виде одного реляционного выражения:
Т3:=(((тСтуденты TIMES тГруппы ) WHERE Ст_код = Гр_стар)
WHERE Гр_год=2000 ) [Ст_ФИО, Ст_код ].
С помощью одного такого выражения можно соединить две таблицы во временную таблицу и вырезать из нее требуемые строки и столбцы.