Скачиваний:
180
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

6.7. Дополнительные операторы

Многие авторы предлагали новые алгебраические операторы после определения Код- дом первоначальных восьми. В этом разделе детально рассматривается несколько таких операторов— SEMIJ0IN (полусоединение), SEMIMINUS (полувычитание), EXTEND (расширение), SUMMARIZE (обобщение) и TCL0SE (транзитивное замыкание). В терминах языка Tutorial D синтаксис этих операторов выглядит следующим образом.

<полусоединениё>

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

SEMIJ0IN реляционное выражениё>

<полувычитание>

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

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

расширение>

::= EXTEND реляционное выражениё>

ADD <список добавляемых расширений>

<добавляемое расширение>

::= <выражевие> AS <имя атрибута>

<обобщение>

::= SUMMARIZE реляционное выражениё> PER реляционное выражение> ADD <список добавляемых обобщений?

<добавляемое обобщениё>

::= <тип обобщения? [ ( <скалярное выражение> ) )

AS <имя атри6ута>

<тип обобщения?

::= COUNT | SUM | AVG | MAX | MIN | ALL | ANY | C0UNTD | SUMD | AVGD

<транзитивное замыкание>

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

Значения различных параметров реляционное выражение>, упомянутые в этом син- таксисе BNF, не должны иметь тип <не проекция?.

Полусоединение

Пусть обозначения А, В, X, Y и I будут иметь тот же смысл, который был им присвоен при определении оператора JOIN в разделе 6.4. Тогда полусоединением отношения А с отношением В (что записывается как A SEMIJ0IN В, причем именно в таком порядке) по определению называется операция, эквивалентная следующей.

( A JOIN В ) { X, Y }

Другими словами, полусоединением отношения А с отношением В называется резуль- тат соединения отношений А и В, для которого дополнительно выполнена операция про- екции по атрибутам отношения А. Тело полученного в результате выполнения этой опе- рации отношения, неформально говоря, состоит из тех кортежей отношения А, которые имеют соответствие в отношении В.

Пример. Получить значения атрибутов Si, SNAME, STATUS и CITY для всех поставщи- ков детали с номером ' Р2'.

S SEMIJOIN ( SP WHERE PI = Pi ( 'P2' ) )

Полувычитание

Снова пусть обозначения А, В, X, Y и Z имеют тот же смысл, что и при определении оператора JOIN в разделе 6.4. Тогда полувычитанием отношений А и В (что записывает- ся как A SEMIMINUS В, причем именно в таком порядке) называется операция, эквива- лентная следующему оператору.

A MINUS ( A SEMIJ0IN В )

Неформально говоря, тело полученного в результате выполнения этой операции отноше- ния состоит из тех кортежей отношения А, которые не нашли соответствия в отношении В.

Пример. Получить значения атрибутов St, SNAME, STATUS и CITY для всех поставщи- ков, не поставляющих деталь с номером ' Р2'.

S SEMIMINUS ( SP WHERE Р# = Р# ( 'Р2' ) )

Операция расширения

Читатель, возможно, заметил, что в описанной нами алгебре нет средств для скаляр- ных вычислений. Конечно, на практике такие возможности просто необходимы. Напри- мер, может понадобиться запросить из базы данных результат вычисления некоторого арифметического выражения, подобного выражению WEIGHT*454, или сослаться на такое значение в выражении WHERE при выборке. (Вспомним, что в нашем примере вес деталей приведен в фунтах; тогда выражение WEIGHT*454 переводит этот вес в граммы5.) Для обеспечения таких возможностей и предназначена операция расширения. Точнее, с ее помощью из определенного отношения (по крайней мере, концептуально) создается но- вое отношение. Оно похоже на начальное, но содержит дополнительный атрибут, значе- ния которого получены посредством некоторых скалярных вычислений. Например, можно написать следующее.

EXTEND Р ADD ( WEIGHT * 454 ) AS GMWT

С помощью этого выражения (заметьте, именно выражения, а не команды или опера- тора, что разрешает вложение подобных выражений в другие выражения) создается но- вое отношение с таким же заголовком, как и у отношения Р, за исключением дополни- тельного атрибута GMWT. Каждый кортеж этого отношения совпадает с соответствующим кортежем отношения Р, но содержит еще одно дополнительное значение атрибута GMWT, вычисляемое в соответствии с указанным выражением, как показано на рис. 6.9.

р#

PNAME

COLOR

WEIGHT

CITY

GMWT

Р1

Nut

Red

12,0

London

5448,0

Р2

Bolt

Green

17,0

Paris

7718,0

РЗ

Screw-

Blue

17,0

Rome

7718,0

Р4

Screw

Red

14,0

London

6356,0

Р5

Cam

Blue

12,0

Paris

5448,0

Р6

Cog

Red

19,0

London

8626,0

Рис. 6.9. Пример выполнения операции расширения

Обратите внимание, что это выражение EXTEND не изменяет содержимое базовой пере- менной-отношения деталей в базе данных. Это всего лишь выражение, такое же, как, на- пример, S JOIN SP, и значит, оно создает определенный результат. В нашем случае этот ре- зультат подобен текущему значению базовой переменной-отношения деталей. (Иначе го- воря, операция расширения — это не реляционный аналог SQL-оператора ALTER TABLE.)

Теперь можно использовать вновь созданный атрибут GMWT в любых операциях про- екции, выборки и т.д., как, например, показано ниже.

( ( EXTEND Р ADD ( WEIGHT * 454 ) AS GMWT )

WHERE GMWT > WEIGHT ( 10000.0 ) ) { ALL BUT GMWT }

Замечание. Конечно, более дружественный пользователю язык должен позволять вставлять подобные выражения непосредственно в предложение WHERE, например, сле- дующим образом.

Р WHERE ( WEIGHT * 454 ) > WEIGHT ( 10000.0 )

Однако такая возможность — это всего лишь синтаксическое усовершенствование. Обратимся к обобщенному представлению данного выражения.

EXTEND A ADD ехр AS Z

В общем случае результатом вычисления подобного выражения будет отношение с заголовком, эквивалентным заголовку исходного отношения А, но с расширенным новым атрибутом Z. Тело результирующего отношения будет состоять из всех кортежей t, где t является кортежем отношения А, дополненного значением нового атрибута Z, который определяется посредством вычисления скалярного выражения ехр для данного кортежа отношения А. При этом отношение А не должно иметь атрибута Z и выражение ехр не должно ссылаться на атрибут Z. Заметьте, что кардинальность результата равна карди- нальности отношения А, а степень результата равна степени отношения А плюс единица. Типом переменной Z в этом случае будет тип выражения ехр.

Приведем еще несколько примеров.

1. EXTEND S ADD 'Supplier' AS TAG

Это выражение эффективно дополняет каждый кортеж отношения S символьным значением 'Supplier' (очевидно, что скалярный литерал (символьное значение) является простейшим случаем скалярного выражения).

2. EXTEND { Р JOIN SP ) ADD ( WEIGHT * QTY ) AS SHIPWT

Этот пример иллюстрирует применение оператора EXTEND к результату реляцион- ного выражения, более сложного, чем просто имя переменной-отношения.

3. ( EXTEND S ADD CITY AS SCITY ) { ALL BUT CITY }

Имя атрибута, такое как CITY, — также допустимое скалярное выражение. Заметь- те, что этот пример равносилен следующему выражению.

S RENAME CITY AS SCITY

Иными словами, оператор RENAME не примитивен! Он может быть определен через оператор EXTEND (и проекцию). Разумеется, мы не собираемся отвергать уже зна- комый оператор RENAME, поскольку он действительно полезен. Однако тот факт, что оператор RENAME — в действительности просто сокращение, является, по крайней мере, интересным.

4. EXTEND Р ADD WEIGHT * 454 AS GMWT, WEIGHT * 16 AS OZWT Этот пример служит иллюстрацией "множественного" расширения.

5. EXTEND S

ADD COUNT ( ( SP RENAME St AS X ) WHERE X = St ) AS NP

Результат вычисления этого выражения показан на рис. 6.10.

s#

SNAME

STATUS

CITY

NP

SI

Smith

20

London

6

S2

Jones

10

Paris

S3

Black

30

Paris

1

S4

Clark

20

London

3

S5

Adams

30

Athens

0

Рис. 6.10. Еще один пример операции расширения Пояснения

■ Для данного поставщика в текущем значении переменной-отношения S вы- ражение

( ( SP RENAME S# AS X ) WHERE X = St )

позволяет возвратить множество кортежей поставок, соответствующих кор- тежу поставщика в текущем значении переменной-отношения SP.

■ Затем для этого множества поставок применяется обобщающая функция COUNT, возвращающая соответствующее значение кардинальности (которое является, конечно же, скалярным значением).

Атрибут NP в результирующем отношении представляет количество деталей, кото- рые поставляются поставщиком, определяемым соответствующим значением атри- бута St. В частности, обратите внимание на значение атрибута NP для поставщика с номером 'S5' — множество кортежей отношения SP для этого поставщика пусто, поэтому функция COUNT возвращает значение "нуль".

Рассмотрим вкратце обобщающие функции. Общее назначение этих функций со- стоит в том, чтобы на основе значений некоторого атрибута определенного отно- шения получить скалярное значение. Типичными примерами являются функции COUNT, SUM, MAX, MIN, ALL и ANY. В языке Tutorial D параметр <вызов обобщающей функции> является особым случаем параметра <скалярвое выражениё> и в общем случае имеет следующий вид.

<имя функции> { реляционное выражение> [, <иня атрибута> ] )

Если параметр <имя функции> имеет значение COUNT, то параметр <имя атрибута> недопустим и должен быть опущен. В остальных случаях параметр <имя атрибута> может быть опущен тогда и только тогда, когда параметр реляционное выражение> задает отношение со степенью, равной единице. Тогда единственный атрибут результирующего отношения, получаемого после вычис- ления выражения реляционное выражение>, будет использоваться по умолча- нию. Вот несколько примеров.

SUM { SP WHERE St = St { 'SI' ), QTY)

SUM ( ( SP WHERE St = St( 'SI' ) ) { QTY } )

Обратите внимание на различие между этими двумя выражениями. Первое выра- жение позволяет подсчитать суммарный объем всех поставок для поставщика с номером 'S1', а второе — суммарный объем всех поставок различных комплектов деталей для поставщика с номером ' S1'.

Если аргумент обобщающей функции оказывается пустым множеством, то функ- ции COUNT и SUM возвращают значение "нуль", а функции MIN и МАХ — наименьшее и наибольшее значения соответствующего домена. Функции ALL и ANY в этом слу- чае возвращают соответственно значения истина и ложь, а функция AVG генериру- ет исключительную ситуацию.

Операция обобщения

Начиная этот раздел, следует сказать, что данная версия оператора SUMMARIZE отлича- ется от версий, рассмотренных в предыдущих изданиях настоящей книги. Фактически это улучшенная версия, в которой учтены определенные трудности, возникавшие в пре- дыдущих версиях при работе с пустыми отношениями.

Как мы уже убедились, в реляционной алгебре операция расширения позволяет вы- полнять "горизонтальные" вычисления в отношении отдельных строк. Оператор обоб- щения выполняет аналогичную функцию для "вертикальных" вычислений в отношении отдельного столбца. Например, рассмотрим следующее выражение.

SUMMARIZE SP PER SP { Pt } ADD SUM ( QTY ) AS TOTQTY

В результате его вычисления создается отношение с заголовком {P|,T0TQTY}, содер- жащее один кортеж для каждого значения атрибута Pt в проекции SP{Pt}. Каждый из этих кортежей содержит значение атрибута Pi и соответствующее общее количество де- талей (рис. 6.11). Другими словами, концептуально исходное отношение Р "перегруппировано" в множество групп кортежей (по одной группе для каждого уни- кального значения атрибута Pi), после чего для каждой полученной группы сгенерирован один кортеж, помещаемый в окончательный результат.

р#

TOTQTY

Р1

600

Р2

1000

РЗ

400

Р4

500

Р5

500

Р6

100

Рис. 6.11. Пример выполнения операции SUMMARIZE В общем случае значение выражения SUMMARIZE A PER В ADD <обо6щение> AS Z определяется следующим образом.

  • Отношение В должно иметь такой же тип, как и некоторая проекция отношения А, т.е. каждый атрибут отношения В должен одновременно присутствовать в отно- шении А. Примем, что атрибутами этой проекции (или, что эквивалентно, атрибу- тами отношения В) являются атрибуты Al, А2, ... , An.

  • Результатом вычисления данного выражения будет отношение с заголовком {А1, А2, ... , An, Z}, где Z является новым добавленным атрибутом.

  • Тело результата содержит все кортежи t, где t является кортежем отношения В, расширенным значением нового атрибута Z. Это значение нового атрибута Z под- считывается посредством вычисления обобщающего выражения по всем корте- жам отношения А, которое имеет те же значения для атрибутов Al, А2, ... , An, что и кортеж t. (Разумеется, если в отношении А нет кортежей, принимающих те же значения для атрибутов Al, А2, ... , An, что и кортеж t, то обобщающее вы- ражение будет вычислено для пустого множества.) Отношение В не должно со- держать атрибут с именем Z, а обобщающее выражение не должно ссылаться на атрибут Z. Заметьте, что кардинальность результата равна кардинальности отно- шения В, а степень результата равна степени отношения В плюс единица. Типом переменной Z в этом случае будет тип обобщающего выражения.

Вот еще один пример.

SUMMARIZE { Р JOIN SP ) PER Р { CITY } ADD COUNT AS NSP Результат его вычисления будет выглядеть так.

CITY

NSP

London

5

Paris

6

Rome

1

Другими словами, результат содержит по одному кортежу для каждого из трех упо- минаемых в отношении Р городов (Лондона, Парижа и Рима), причем в каждом кортеже показано количество поставок деталей из соответствующего города. v

Сделаем некоторые выводы.

1. Предложенный синтаксис позволяет выполнять множественные операции обоб- щения, как, например, показано ниже.

SUMMARIZE SP BY { Р# } ADD SUM ( QTY ) AS TOTQTY,

AVG ( QTY ) AS ATCQTY

2. Общая форма параметра <о6общение> (повторимся) имеет следующий вид.

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

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

ADD <список добавляемых обобщений>

Каждый элемент <добавляемое о6о6щение>, в свою очередь, имеет следующий вид.

«тип обобщения^ [ { <скалярное зыражение> ) ] AS <имя атри6ута>

Чаще всего параметр <тип обобщения> задает одну из функций COUNT, SUM, AVG, MIN, MAX, ALL, ANY, COUNTD, SUMD и AVGD. Буква "D" (distinct — различный) в названии функций COUNTD, SUMD и AVGD означает следующее: "перед выполнением этой обобщающей операции удалить все избыточные повторяющиеся значения". Пара- метр <скалярное выражение> может содержать ссылки на атрибуты отношения, ко- торое определяется параметром реляционное выражение>, размещенным непо- средственно за ключевым словом SUMMARISE.

Замечание. Параметр <скалярное выражениё> (вместе с квадратными скобками) можно опустить лишь в том случае, если параметр <тип обобщение имеет значе- ние COUNT.

Обратите также внимание на то, что параметр <до6авляемое о6общение> — это не вызов обобщающей функции, задаваемый параметром <вызов обобщающей функции>. Параметр <вызов обобщающей функции> задает скалярное выражение и может использоваться в любом месте, где допустим вызов оператора выборки (в частности, скалярного литерала). Параметр Добавляемое о6общение> — это не скалярное значение; он является операндом оператора SUMMARIZE и имеет смысл только в контексте операции обобщения.

3. Как вы, наверное, догадались, оператор SUMMARIZE не примитивен— его можно моделировать с помощью оператора EXTEND. Например, рассмотрим следующее выражение.

SUMMARIZE SP PER S { St } ADD COUNT AS NP

По сути, это сокращенная запись представленного ниже более сложного выраже- ния.

{ EXTEND S { St }

£kr*v^ ADD ( ( SP RENAME St AS X ) WHERE X = St ) AS Y,

COUNT { Y ) AS NP )

{ St, NP }

Возможен еще один эквивалентный вариант записи.

WITH ( S { St } ) AS Tl,

( SP RENAME St AS X ) AS T2,

( EXTEND Tl ADD ( T2 WHERE X = St ) AS Y ) AS T3, ( EXTEND T3 ADD COUNT ( Y ) AS NP ) AS T4: T4 { St, NP }

4. Рассмотрим следующий пример.

SUMMARIZE SP PER SP { } ADD SUM ( QTY ) AS GRANDTOTAL

В нем группирование и подведение итогов производятся для отношения, которое вообще не имеет атрибутов. Пусть sp — это текущее значение базовой перемен- ной-отношения SP. Предположим, что отношение sp содержит по крайней мере один кортеж. Тогда все кортежи отношения sp будут иметь "одинаковые значения" по пустому множеству атрибутов, а именно— по "0-кортежу" [5.5]. Таким обра- зом, в этом контексте они образуют единственную группу, для которой в конечном результате будет построен всего один кортеж. Другими словами, обобщающая

функция вычисляется только один раз и для всего отношения sp в целом. Следова- тельно, вычисление представленного выше выражения SUMMARIZE даст в результате отношение с одним атрибутом (с именем GRANDTOTAL) и одним кортежем, причем единственное скалярное значение в единственном результирующем кортеже явля- ется общим итогом по всем значениям атрибута QTY в исходном отношении sp.

Если, с другой стороны, исходное отношение sp совсем не имеет кортежей, то нет и групп, а следовательно, нет и результирующих кортежей, т.е. результирующее отношение также будет пустым. Однако приведенное ниже выражение, напротив, "будет работать" (т.е. будет возвращать корректное значение, а именно — нуль), даже если отношение sp пустое 6.

SUMMARIZE SP PER RELATION { TUPLE { } }

ADD SUM ( QTY ) AS GRANDTOTAL

Точнее, это выражение будет возвращать отношение с одним лишь атрибутом GRANDTOTAL и одним кортежем, в котором значение GRANDTOTAL будет равно нулю. Поэтому автор предлагает разрешить опускать предложение PER в выражении SUMMARIZE, как это сделано в следующем примере.

SUMMARIZE SP ADD SUM ( QTY ) AS GRANDTOTAL

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

PER RELATION { TUPLE { } }

Транзитивное замыкание

Операция транзитивного замыкания упоминается здесь, в основном, для полноты из- ложения. Ее детальное обсуждение выходит за рамки данной главы. Тем не менее мы да- дим здесь определение этой операции. Пусть А — произвольное бинарное отношение с ат- рибутами X и Y, принадлежащими одному типу Т. Тогда транзитивным замыканием от- ношения А (что записывается как TCL0SE А) называется отношение А+, заголовок которого такой же, как заголовок отношения А, а тело является супермножеством отношения А.

Супермножество отношения А определяется следующим образом. Кортеж { Х:х, Y:y } принадлежит отношению А* тогда и только тогда, когда он принадлежит отноше- нию А или когда существует последовательность значений zl, z2, ... , zn (принадлежащихтипу Т), такая, что все кортежи { Х:х, Y:zl }, { X:zl, Y:z2 }, ... , { X:zn, Y:y } принадлежат отношению А. Иначе говоря, кортеж (х,у) принадлежит от- ношению А* только тогда, когда (нестрого говоря) в представляющем отношение А графе есть линия, соединяющая точку х с точкой у. Обратите внимание на то, что тело отноше- ния А всегда содержится в теле отношения А+ как подмножество.

Обсуждение этого вопроса будет продолжено в главе 23.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]