- •6. 1. Введение
- •Обзор начальной алгебры
- •6.2. Замкнутость
- •6. 3. Синтаксис реляционной алгебры
- •6. 4. Традиционные операции над множествами
- •6. 5. Специальные реляционные операции
- •Пусть отношения а и в имеют заголовки
- •6. 6 Примеры
- •6. 6. 1. Получить имена поставщиков, которые поставляют деталь р2
- •6. 6. 2. Получить имена поставщиков, которые поставляют по крайней мере одну красную деталь
- •6.7. Зачем нужна алгебра
- •6. 8. Операции расширения и подведения итогов
- •6.9. Операторы обновления
- •6.10. Реляционные сравнения
- •6.11. Резюме
6. 3. Синтаксис реляционной алгебры
Сейчас самое время ввести конкретный синтаксис для операций реляционной алгебры (см. 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-грамматика для реляционной алгебры
Несколько замечаний по грамматике
В главе 4 приводилось объяснение условным объяснениям типа «commalist» (что означает список, разделенный запятыми).
Обозначения relation (отношение) и attribute (атрибут) определяются как идентификаторы, которые представляют собой соответственно имя отношения и имя атрибута.
Объяснение обозначения condition (условие) приводится ниже в этой главе.
В определенной выше грамматике для обеспечения правильного порядка в вычислениях сложных выражений необходимо часто использовать скобки. Ниже в этой главе описаны некоторые упрощения, во многих случаях позволяющие уменьшить общее количество скобок. Об одном из таких упрощений, а именно о множественном переименовании, мы поговорим прямо сейчас. Рассмотрим следующий пример:
(S RENAME CITY AS SCITY) RENAME S# AS SNUM
Как указывалось ранее, внутреннее выражение служит для вычисления отношения с телом, таким же как и у отношения S, но имеющим атрибут города с именем SCITY, а не CITY; а общее выражение — соответственно для вычисления отношения с таким же телом, но дополнительно с измененным именем атрибута номера поставщика S# на SNUM. Чтобы можно было переименовать несколько атрибутов за один раз, не используя многоуровневые вложенные выражения, вводится расширенная версия оператора rename, в которой предыдущий пример будет выглядеть следующим образом:
( S RENAME CITY AS SCITY, S# AS SNUM )
Иными словами, другой допустимый синтаксис для этой синтаксической категории переименования таков:
( term RENAME rename-commalist)
Здесь обозначение commaiist (как указывалось выше) означает список через запятую, а rename означает, что каждый из элементов этого списка представляет собой выражение attribute AS attribute
6. 4. Традиционные операции над множествами
Теперь рассмотрим отдельные операции начальной алгебры подробнее, используя конкретный синтаксис, представленный в предыдущем разделе.
Настоящий раздел касается традиционных операций над множествами, а следующий — специальных реляционных операций.
Традиционные операции над множествами — это объединение, пересечение, вычитание и произведение (точнее, расширенное декартово произведение). Давайте сначала рассмотрим объединение.
В математике объединение двух множеств является множеством всех элементов, принадлежащих или обоим, или одному из исходных множеств. Поскольку отношение является, нестрого говоря, множеством кортежей, то, очевидно, можно построить объединение двух отношений; результат будет множеством, содержащим все кортежи, принадлежащие или обоим, или одному из исходных отношений. Например, объединение множества кортежей поставщиков в отношении S и множества кортежей деталей в отношении Р является, несомненно, множеством.
Однако, хотя такой результат и является множеством, он не является отношением; отношения не могут содержать смесь кортежей разных типов, они должны содержать однородные кортежи. И конечно, результат тоже должен быть отношением, поскольку необходимо, чтобы сохранилось свойство замкнутости. Следовательно, объединение в реляционной алгебре не полностью совпадает с математическим объединением, вернее, это особая форма объединения, в которой требуется, чтобы два исходных отношения, нестрого говоря, имели "одну и ту же форму". Это означает, например, что они оба содержат кортежи поставщиков или кортежи деталей, а не смесь обоих видов. Если два отношения имеют "одну и ту же форму", то их можно объединить и результат объединения будет отношением той же формы; иначе говоря, свойство замкнутости будет сохранено.
Более точный термин понятия "одна и та же форма" — совместимо по типу1. Будем говорить, что два отношения совместимы по типу, если у них идентичные заголовки, а точнее,
если каждое из них имеет одно и то же множество имен атрибутов (следовательно, заметьте, они заведомо должны иметь одну и ту же степень);
если соответствующие атрибуты (т.е. атрибуты с теми же самыми именами двух отношениях) определены на одном и том же домене.
Операции объединения, пересечения и вычитания требуют от операндов совместимости по типу. Аргументы, аналогичные приведенным выше для объединения, применимы для также для пересечения и вычитания. (операция декартова произведения, напротив, такого требования к операндам не выдвигает, хотя и имеет собственные требования, как вы скоро убедитесь.) Если необходимо выполнить операцию объединения, пересечения или вычитания двух отношений, которые почти совместимы по типу, за исключением некоторых различий в именах атрибутов, можно использовать оператор RENAME (обсуждаемый выше в этой главе), чтобы сделать эти отношения полностью совместимыми по типу, прежде чем выполнить необходимую операцию.
Теперь можно приступить к определениям традиционных операций над множествами, точнее, к тем их разновидностям, которые поддерживаются в реляционной алгебре.
Объединение
Объединением двух совместимых по типу отношений А и B (A union B) называется отношение с тем же заголовком, как и в отношениях А и В, и с телом, состоящим из множества всех кортежей t, принадлежащих А или В или обоим отношениям.
Пример. Пусть отношения А или В будут такими, как показано на рис. 6.3 (отношение А представляет поставщиков из Лондона, а отношение В – поставщиков, которые, например, поставляют деталь Р1). Тогда выражение A union B (см. рис. 6. 3,а) представляет поставщиков, которые или размещаются в Лондоне, или поставляют деталь Р1 (либо и то и другое). Обратите внимание, что результат имеет три кортежа, а не четыре – повторяющиеся кортежи удаляются по определению
|
A |
|
|
|
|
B |
|
|
|
|
||||||||||||||
|
S# |
SNAME |
STATUS |
CITY |
|
S# |
SNAME |
STATUS |
CITY |
|
||||||||||||||
|
S1 S4 |
Smith Clark |
20 20 |
London London |
|
S1 S2 |
Smith Jones |
20 10 |
London Paris |
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||
a) Объединение |
S# |
SNAME |
STATUS |
CITY |
|
|||||||||||||||||||
(A UNION B) |
S1 S4 S2 |
Smith Clark Jones |
20 20 10 |
London London Paris |
|
|||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||
б) Пересечение (A INSERT B ) |
|
|
|
|
|
|||||||||||||||||||
S# |
SNAME |
STATUS |
CITY |
|
||||||||||||||||||||
S1 |
Smith |
20 |
London |
|
||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||
в) |
Вычитание (A MINUS B) |
|
|
г) |
Вычитание (В MINUS А) |
|
|
|
||||||||||||||||
|
S# |
SNAME |
STATUS |
CITY |
|
S# |
SNAME |
STATUS |
CITY |
|
||||||||||||||
|
S4 |
Clark |
20 |
London |
|
S2 |
Jones |
10 |
Paris |
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
Рис. 6.3. Примеры операций объединения, пересечения и вычитания.
Замечание. Вопрос удаления дубликатов не возникает в других традиционных операциях над множествами (пересечение, вычитание и произведение). Фактически существует еще только одна операция (помимо объединения), где этот вопрос возникает, - проекция.
Пересечение
Пересечением двух совместимых по типу отношений А и В (A INTERSECT B) называется отношение с тем же заголовком , как и в отношениях А и В, и с телом, состоящим из множества всех кортежей t, принадлежащих одновременно обоим отношениям А и В.
Пример. Пусть снова отношения А и В будут такими, как показано на рис. 6. 3. Тогда выражение (A INTERSECT B) (см. рис. 6.3,б) представляет поставщиков, которые размещаются в Лондоне и поставляют деталь Р1.
Вычитание
Вычитанием двух совместимых по типу отношений А и В (А minus В) называется отношение с тем же заголовком, как и в отношениях А и В, и с телом, состоящим из множества всех кортежей t, принадлежащих отношению А и не принадлежащих отношению В.
Пример. Пусть снова отношения А и В будут такими, как показано на рис. 6.3. Тогда выражение А minus В (см. рис. 6.3,в) представляет поставщиков, которые размещаются в Лондоне и не поставляют деталь Р1, а в minus а (см. рис. 6.3,г) представляет поставщиков, которые поставляют деталь Р1 и не размещаются в Лондоне. Заметьте, что вычитание учитывает порядок следования точно так же, как и в обычной арифметике (например, "5-2" и "2-5" — это не одно и то же).
Произведение
В математике декартово произведение (или для краткости произведение) двух множеств является множеством всех таких упорядоченных пар элементов, что первый элемент в каждой паре берется из первого множества, а второй элемент в каждой паре берется из второго множества. Следовательно, декартово произведение двух отношений должно быть множеством упорядоченных пар кортежей. Но опять-таки необходимо сохранить свойство замкнутости; иначе говоря, результат должен содержать кортежи, а не упорядоченные пары кортежей. Поэтому версия декартова произведения в реляционной алгебре представляет собой расширенную форму операции, в которой каждая упорядоченная пара кортежей заменяется одним кортежем, образованным из двух сцепленных кортежей этой пары. "Сцепление" здесь означает объединение (в смысле теории множеств, а не реляционной алгебры); т.е. кортежи
{ <А1:а1>, <А2:а2>, ..., <Аm:am> }
и
{ <В1:b1>, <В2:Ь2>, ..., <Вn:Ьn> }
(имена атрибутов показаны для определенности) сцепляются в один кортеж
{ <A1 :al>, <A2:a2>, ..., <Am:am>, <В1:b1>, <В2:Ь2>,..., <Вn:Ьn> }
Другая проблема, возникающая в связи с декартовым произведением, заключается в том, что результирующее отношение должно иметь правильно сформированный заголовок. Очевидно, что заголовок в своей основе представляет просто сцепление двух заголовков исходных отношений. Следовательно, если эти два заголовка имеют какие-то общие имена атрибутов, возникает проблема. Если допустить такую операцию, то результирующий заголовок будет иметь два одинаковых атрибута, а значит, будет "неверно сформированным". Поэтому, если нужно построить декартово произведение двух отношений, которые имеют какие-то общие имена атрибутов, необходимо прежде для переименования соответствующих атрибутов применить оператор rename.
Итак, декартово произведение двух отношений А и В ( A times в), где А и В не имеют общих имен атрибутов, определяется как отношение с заголовком, который представляет собой сцепление двух заголовков исходных отношений А и В, и телом, состоящим из множества всех кортежей t, таких, что t представляет собой сцепление кортежа а, принадлежащего отношению А, и кортежа b, принадлежащего отношению В. Обратите внимание, что кардинальное число результата равняется произведению кардинальных чисел исходных отношений А и В, а степень равняется сумме их степеней.
Пример. Пусть отношения А и В будут такими, как показано на рис. 6.4 (отношение А представляет, например, номера всех текущих поставщиков, а отношение В — номера всех текущих деталей). Тогда a times в— это все текущие пары поставщик-деталь и деталь-поставщик.
Прежде чем завершить обсуждение этой операции, необходимо указать, что на практике явное использование операции декартова произведения требуется только для чересчур сложных запросов (см. упражнения и ответы на них в конце главы). Другими словами, для реального запроса относительно редко требуется (хотя нельзя сказать что вовсе не требуется) использование операции декартова произведения. Эта операция включена в реляционную алгебру главным образом по концептуальным соображениям. В частности, как отмечается ниже в этой главе, декартово произведение требуется как промежуточный шаг при определении операции θ-соединения (а операция θ-соединения используется довольно часто).
S # |
|
P# |
|
.. |
.. |
|
.. |
.. |
|
.. |
.. |
|
.. |
.. |
S1 S1 S1 S1 S1 S1 |
|
P1 P2 P3 P4 P5 P6 |
|
S2 S2 S2 S2 S2 S2 |
P1 P2 P3 P4 P5 P6 |
|
S3 S3 S3 S3 S3 S3 |
P1 P2 P3 P4 P5 P6 |
|
S4 S4 S4 S4 S4 S4 |
P1 P2 P3 P4 P5 P6 |
|
S5 S5 S5 S5 S5 S5 |
P1 P2 P3 P4 P5 P6 |
.. |
|
.. |
|
.. |
.. |
|
.. |
.. |
|
.. |
.. |
|
|
|
|
|
|
|
|
||||||||||||||||
A |
S# |
B |
P# |
|
||||||||||||||||
|
S1 S2 S3 S4 S5 |
|
P1 P2 P3 P4 P5 P6 |
|
||||||||||||||||
|
|
|
|
|
||||||||||||||||
Декартово произведение (A TIMES B) |
||||||||||||||||||||
|
S# |
|
P# |
|
... |
… |
|
… |
… |
|
… |
… |
|
… |
… |
|
||||
|
S1 S1 S1 S1 S1 S1 |
|
P1 P2 P3 P4 P5 P6 |
|
S2 S2 S2 S2 S2 S2 |
P1 P2 P3 P4 P5 P6 |
|
S3 S3 S3 S3 S3 S3 |
P1 P2 P3 P4 P5 P6 |
|
S4 S4 S4 S4 S4 S4 |
P1 P2 P3 P4 P5 P6 |
|
S5 S5 S5 S5 S5 S5 |
P1 P2 P3 P4 P5 P6 |
|
||||
|
… |
|
… |
|
… |
… |
|
… |
… |
|
… |
… |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 6. 4. Пример операции декартова произведения
Отметим, что операция декартова произведения не очень важна на практике, потому что после ее выполнения в результате нет никакой дополнительной информации по сравнению с исходной. В случае, показанном в примере на рис. 6.4, результат не говорит нам ничего нового – он просто подтверждает, что существуют номера поставщиков и номера деталей.
Несколько синтаксических упрощений
Легко проверить, что операция объединения ассоциативна, т. е. если А, В, С – произвольные выражения (дающие совместимые по типу отношения), то выражения
(A UNION B) UNION C
и
A UNION ( B UNION C)
эквивалентны. Следовательно для удобства можно разрешить запись последовательных операторов объединения без использования круглых скобок; таким образом, предыдущее выражение можно однозначно упростить:
A UNION B UNION C
Аналогичные замечания можно сделать и для операций пересечения и декартова произведения (но не вычитания). Заметим еще, что операции объединения, пересечения и декартова произведения (но не вычитания) еще и коммутативны, т. е. выражения
A UNION B
и
В UNION А
эквивалентны; точно также и для операций пересечения и произведения.
Замечание. К вопросу ассоциативности и коммутативности мы вернемся далее в этой книге. А относительно операции декартова произведения мимоходом заметим, что эта операция в теории множеств не является ни ассоциативной, ни коммутативной, но ее расширенная версия, как мы определили, и ассоциативна и коммутативна.