Сейчас самое время ввести конкретный синтаксис для операций реляционной алгебры (см. BNF-грамматику на рис. 6. 2). Обратите внимание, что синтаксис не рассматривается в качестве серьезного кандидата для языка конечного пользователя, он не особенно дружественный, а используется как надежная основа для обсуждения операторов в оставшейся части главы и, конечно, его можно было бы сделать более дружественным с помощью соответствующего «синтаксического сахара». И действительно, несколько позже в этой главе будут предложены наши собственные простые усовершенствования.
expession
::= monadic- expression I dyadic- expression
monadic- expression
::= renaming I restriction I projection
renaming
::= term RENAME attribute AS attribute
term
::= relation I (expression)
restriction
::= term WHERE condition
projection
::= term I term [ attribute-commalist ]
dyadic- expression
::= projection dyadic-operation expression
dyadic- operation
::= UNION I INTERSECT I MINUS I TIMES I JOIN I DIVIDERY
Рис. 6. 2. BNF-грамматика для реляционной алгебры
Несколько замечаний по грамматике
1. В главе 4 приводилось объяснение условным объяснениям типа «commalist» (что означает список, разделенный запятыми).
2. Обозначения relation (отношение) и attribute (атрибут) определяются как идентификаторы, которые представляют собой соответственно имя отношения и имя атрибута.
3. Объяснение обозначения condition (условие) приводится ниже в этой главе.
В определенной выше грамматике для обеспечения правильного порядка в вычислениях сложных выражений необходимо часто использовать скобки. Ниже в этой главе описаны некоторые упрощения, во многих случаях позволяющие уменьшить общее количество скобок. Об одном из таких упрощений, а именно о множественном переименовании, мы поговорим прямо сейчас. Рассмотрим следующий пример:
(S RENAME CITY AS SCITY) RENAME S# AS SNUM
Как указывалось ранее, внутреннее выражение служит для вычисления отношения с телом, таким же как и у отношения S, но имеющим атрибут города с именем SCITY, а не CITY; а общее выражение — соответственно для вычисления отношения с таким же телом, но дополнительно с измененным именем атрибута номера поставщика S# на SNUM. Чтобы можно было переименовать несколько атрибутов за один раз, не используя многоуровневые вложенные выражения, вводится расширенная версия оператора rename, в которой предыдущий пример будет выглядеть следующим образом:
(S RENAME CITY AS SCITY, S# AS SNUM)
Иными словами, другой допустимый синтаксис для этой синтаксической категории переименования таков:
(termRENAME rename-commalist)
Здесь обозначение commaiist (как указывалось выше) означает список через запятую, а rename означает, что каждый из элементов этого списка представляет собой выражение attribute AS attribute