Реферат: Реляционное исчисление
<реляционная операция>
: : = <прототип кортежа> [ WHERE <логическое выражение> ]
<прототип кортежа>
: : = <выражение кортежа>
Напоминаем также, что следующие синтаксические правила теперь несколько упрощены.
- Во-первых, все ссылки на переменные кортежей в параметре <прототип кортежа> должны быть свободными в пределах значения этого параметра.
- Во-вторых, ссылка на переменную кортежа в предложении WHERE может быть свободной только в случае, если на эту же переменную (обязательно свободная) присутствует в соответствующем значении параметра <прототип кортежа>.
Например, следующее выражение является допустимым значением параметра <реляционная операция> («Получить номера поставщиков, находящихся в Лондоне»).
SX.S# WHERE SX.CITY = ‘London’
Здесь ссылка на переменную SX в прототипе кортежа является свободной. Ссылка на переменную SX в предложении WHERE также является свободной, поскольку ссылка на ту же переменную (обязательно свободную) имеется и в значении параметра <прототип кортежа> этого выражения.
Замечание. Далее термин «прототип кортежа» будет употребляться без скобок.
Приведём другой пример («Получить имена поставщиков детали с номером ‘P2’»)
SX.SNAME WHERE EXISTS SPX (SPX.S# SX.S# AND
SPX.P# = P# (‘P2’) )
Здесь все ссылки на переменную SX являются свободными, тогда как все ссылки на переменную SPX (в предложении WHERE) являются связанными, как и должно быть, поскольку на них нет ссылок в прототипе кортежа.
Интуитивно понятно, что результатом выполнения операции, заданной параметром <реляционная операция>, будет отношение, содержащее все возможные значения кортежей, определяемых параметром <прототип кортежа>, для которых результат вычисления логического выражения, заданного в предложении WHERE параметром <логическое выражение>, принимает значение истина. (Если предложение WHERE опущено, это эквивалентно указанию выражения WHERE true.) Сделаем некоторые уточнения.
- Прежде всего, прототип кортежа ─ это список разделённых запятыми элементов (возможно, заключённый в скобки), каждый элемент которого является либо ссылкой на атрибут кортежа (который может содержать предложение AS для введения нового имени атрибута), либо просто именем переменной кортежа. Тем не менее отметим следующее.
а) В этом контексте имя переменной кортежа чаще всего является сокращённым обозначением списка разделённых запятыми ссылок на атрибуты, по одной для каждого атрибута отношения, на котором задана данная переменная кортежа.
б) Ссылка на атрибут кортежа без предложения AS, в принципе, является сокращённым обозначением ссылки с предложением AS, в которой новое имя атрибута совпадает со старым.
Следовательно, без потери общности прототип кортежа можно рассматривать как список, состоящий из разделённых запятыми ссылок на атрибуты в виде Vi.Ai AS Bj. Обратите внимание, что ссылки Vi- и Aj-е могут повторяться, тогда как ссылки Bj-е должны быть разными.
- Пусть V1, V2, … ,Vm будут различными переменными кортежей, упоминаемыми в прототипе кортежа, и пусть эти переменные будут определены на отношениях r1, r2, … ,rm соответственно. Примем, что r1’, r2’, … ,rm’ ─ это новые отношения, полученные после переименования атрибутов в предложении AS, и пусть r’ ─ это декартово произведение отношений r1’, r2’, … , rm’.
- Пусть отношение r ─ это выборка из отношения r’, удовлетворяющая формуле WFF в предложении WHERE.
Замечание. Здесь предполагается, что на предыдущем шаге были также переименованы атрибуты, упоминающиеся в предложении WHERE; в противном случае функция WFF в предложении WHERE может не иметь смысла.
- Конечное значение реляционной операции, заданной параметром <реляционное выражение>, определяется как проекция отношения r по всем заданным атрибутам Bj.
2.7. Примеры.
Представляем несколько примеров использования реляционного исчисления кортежей для формулирования запросов.
Ø Определить имена поставщиков детали с номером ‘P2’
SX
WHERE EXISTS SPX (SPX.S# = SX.S# AND
SPX.P# = P# (‘P2’) )
Обратите внимание на использование имени переменной кортежа в прототипе кортежа. Этот пример является сокращённой записью следующего выражения.
(SX.S#, SX.NAME, SX.STATUS, SX.CITY)
WHERE EXISTS SPX (SPX.S# = SX.S# AND
SPX.P# = P# (‘P2’) )
Этот же пример решённый средствами реляционной алгебры выглядит так
( (SP JOIN S) WHERE P# =’P2’) {SNAME}
Ø Определить имена поставщиков по крайней мере одной красной детали
SX.SNAME
WHERE EXISTS SPX (SX.S# = SPX.S# AND
EXISTS PX (PX.P# = SPX.P# AND
PX.COLOR = COLOR (‘Red’) ) )
Этот же пример решённый средствами реляционной алгебры выглядит так
( ( ( P WHERE COLOR = COLOR (‘Red’) )
JOIN SP) {S#} JOIN S) {SNAME}
3. Сравнительный анализ реляционного исчисления и реляционной алгебры.
В начале утверждалось, что реляционная алгебра и реляционное исчисление в своей основе эквивалентны. Осудим это утверждение более подробно. Вначале Кодд показал, что алгебра по крайней мере мощнее исчисления. Он сделал это, придумав алгоритм, называемый алгоритмом редукции Кодда, с помощью которого любое выражение исчисления можно преобразовать в семантически эквивалентное выражение алгебры. Мы не станем приводить здесь этот алгоритм полностью, а ограничимся довольно сложным примером, иллюстрирующим в общих чертах, как он функционирует.
S# | SNAME | STATUS | CITY |
S1 | Smith | 20 | London |
S2 | Jones | 10 | Paris |
S3 | Black | 30 | Paris |
S4 | Clark | 20 | London |
S5 | Adams | 30 | Athens |
S# | P# | J# | QTY |
S1 | P1 | J1 | 200 |
S1 | P1 | J4 | 700 |
S2 | P3 | J1 | 400 |
S2 | P3 | J2 | 200 |
S2 | P3 | J3 | 200 |
S2 | P3 | J4 | 500 |
S2 | P3 | J5 | 600 |
S2 | P3 | J6 | 400 |
S2 | P3 | J7 | 800 |
S2 | P5 | J2 | 100 |
S3 | P3 | J1 | 200 |
S3 | P4 | J2 | 500 |
S4 | P6 | J3 | 300 |
S4 | P6 | J7 | 300 |
S5 | P2 | J2 | 200 |
S5 | P2 | J4 | 100 |
S5 | P5 | J5 | 500 |
S5 | P5 | J7 | 100 |
S5 | P6 | J2 | 200 |
S5 | P1 | J4 | 100 |
S5 | P3 | J4 | 200 |
S5 | P4 | J4 | 800 |
S5 | P5 | J4 | 400 |
S5 | P6 | J4 | 500 |
P# | PNAME | COLOR | WEIGHT | CITY |
P1 | Nut | Red | 12.0 | London |
P2 | Bolt | Green | 17.0 | Paris |
P3 | Screw | Blue | 17.0 | Rome |
P4 | Screw | Red | 14.0 | London |
P5 | Cam | Blue | 12.0 | Paris |
P6 | Cog | Red | 19.0 | London |