Главная » SQL, Базы данных » ДОПОЛНИТЕЛЬНЫЕ ОПЕРАЦИИ

0

С тех пор, как Кодд определил свои восемь оригинальных операций, многочисленные авторы предложили новые алгебраические операции. В данном разделе достаточно подробно рассматриваются несколько таких операций —  SEMIJOIN, SEMIMINUS, EXTEND, SUMMARIZE и TCLOSE. В терминах  применяемого  в данной книге синтаксиса языка Tutorial D эти операции охватывают пять новых форм выражения <nonproject>, которые определены, как показано ниже.

<semijoin>                                         ::= <relation exp>

SEMIJOIN <relation exp>

<semiminus>

::= <relation exp> SEMIMINUS <relation exp>

<extend>                                        ::= EXTEND <relation exp> ADD ( <extend add commalist> )

Если разделенный запятыми список commalist содержит только одно  выражение

<extend add>, круглые скобки можно опустить.

<extend add>

<ехр> AS   <attribute

name>

<summarize>

::=     SUMMARIZE  <relation  exp>   PER

<relation exp> ADD  (    <summarize add commalist>   )

Если разделенный запятыми список commalist содержит только одно  выражение

<summarize add>, круглые скобки можно опустить.

<summarize add>

::= <summary type> [ ( <scalar exp>

) ] AS <attribute

name>

< summary type>

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

<tclose>

: : =   TCLOSE <relation  exp>

Различные реляционные выражения <relation exp>, упомянутые в  приведенных выше правилах вывода в форме Бэкуса—Наура, не должны относиться к типу

<nonproject>.

6 Кстати, следует отметить, что термин "универсальное отношение" обычно используется в литературе во многих разных смыслах (см., например, [13.20]).

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

Допустим, что а, b, X и Y соответствуют требованиям, которые указаны в подразделе "Соединение" раздела 7.4. В таком случае операция полусоединения отношений а и b (в указанном порядке), a SEMIJOIN b, определена как эквивалентная следующей операции.

(  a JOIN b  )   {  X,  Y  }

Иными словами, полусоединение а и b представляет собой соединение а и b, к которому применена операция проекции по атрибутам а. Поэтому, неформально выражаясь, тело результата содержит те кортежи отношения а, которые имеют аналоги в отношении b.

Пример. Получить атрибуты s#, SNAME, STATUS И CITY поставщиков, которые  поставляют деталь Р2.

S   SEMIJOIN   (   SP  WHERE   P#   =   Р#    (‘Р2′)    )

Кстати, следует отметить, что многие практически применяемые запросы,  которые основаны на использовании  операции  соединения,  фактически  требуют  применения полусоединения; это означает, что на практике было бы желательно  обеспечить непосредственную поддержку оператора SEMIJOIN. Аналогичное  замечание относится и к оператору SEMIMINUS (см. следующий подраздел).

Полуразность

Операция полуразности между а и b (в указанном порядке), a SEMIMINUS b, определена как эквивалентная следующей операции.

a MINUS   (   a  SEMIJOIN b   )

Поэтому, неформально выражаясь, телом результата являются те кортежи отношения а,

которые не имеют аналогов в отношении b.

Пример. Получить атрибуты S#, SNAME, STATUS и CITY поставщиков, которые не поставляют деталь Р2.

S   SEMIMINUS    (   SP WHERE   Р#   =   Р#    (‘Р2′)    )

Расширение

Читатель мог заметить, что описанная до сих пор алгебра не имеет вычислительных возможностей в том смысле, который под этим обычно подразумевается. Но на практике, безусловно, желательно иметь такие возможности. Например, может потребоваться, чтобы была возможность выполнить выборку значения арифметического выражения, такого как WEIGHT * 454, или обратиться к подобному значению в конструкции WHERE (здесь подразумевается7, без учета сведений об единицах измерения, приведенных в разделе 5.4, что вес детали задан в фунтах, а 1 фунт = 454 грамма). Назначение операции расширения EXTEND состоит в поддержке таких возможностей. Если  быть точнее, то операция EXTEND принимает одно отношение и возвращает другое, идентичное заданному, если не

Здесь также предполагается, что "*" представляет собой допустимую операцию между весами и целыми числами.

Контрольный вопрос. Каков тип результата подобной операции?

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

EXTEND P ADD ( WEIGHT * 454 ) AS GMWT

Данное выражение (следует подчеркнуть, что это — выражение, а не  команда  или оператор и поэтому может вкладываться в другие выражения)  приводит к получению отношения с таким же заголовком, как Р, не считая того, что оно содержит дополнительный атрибут с именем GMWT. Каждый кортеж этого отношения совпадает с соответствующим кортежем отношения Р, за исключением того, что он дополнительно содержит значение веса в граммах  GMWT, вычисленного с помощью заданного арифметического выражения WEIGHT * 454 (рис. 7.9).

Рис. 7.9. Пример применения операции EXTEND

Важное замечание. Следует учитывать, что это выражение EXTEND не изменило в базе данных переменную отношения деталей; это — просто выражение и, как любое другое выражение, оно просто представляет некоторое значение. Как оказалось, это значение в данном конкретном случае весьма напоминает текущее значение переменной отношения деталей. (Иными словами, операция EXTEND не может рассматриваться как аналог операции ALTER TABLE  …   ADD COLUMN языка SQL в реляционной алгебре.)

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

как показано ниже.

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

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

Примечание. Безусловно, в более дружественном языке может быть разрешено включать такие вычислительные выражения непосредственно в конструкцию WHERE примерно следующим образом.

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

(См. описание операции сокращения, приведенное в разделе 7.4.) Но данное средство фактически представляет собой просто удобное синтаксическое  дополнение. В таком случае, вообще говоря, значением следующей операции расширения

EXTEND a ADD exp 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, просто любопытно отметить, что фактически она представляет собой всего лишь сокращенную форму.

4.  EXTEND P ADD {WEIGHT * 454 AS GMWT, WEIGHT * 16 AS OZWT)

В данном примере иллюстрируется применение "множественной операции

EXTEND".

5.  EXTEND  S ADD COUNT   (    (   SP  RENAME   Si  AS  X   )   WHERE X  = S#   )   AS NP

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

Пояснение к этому выражению приведено ниже.

а)  Для указанного поставщика выражение (  (  SP RENAME s# AS X  )   WHERE x =  s#   ) позволяет определить множество поставок, выполненных этим по ставщиком.

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

Таким образом, атрибут NP в полученных результатах обозначает количество деталей, поставляемых поставщиком, который указан с помощью  соответствующего значения S#. Здесь заслуживает особого внимания значение NP для поставщика S5; множество поставок для поставщика S5  является пустым и поэтому вызов оператора COUNT возвращает нуль.

Рис. 7.10. Еще один пример применения операции EXTEND

В этой связи кратко рассмотрим агрегирующие операции. Назначение каждой такой операции, вообще говоря, состоит в получении единственного скалярного значения из всех значений, присутствующих в некотором указанном атрибуте некоторого указанного отношения (обычно производного отношения).  Типичными  примерами являются операции COUNT, SUM, AVG, MAX, MIN, ALL и ANY. В языке Tutorial D вызов агрегирующего оператора  <agg  op  inv>  представляет  собой  особый  вид  скалярного  выражения

<scalar exp>, поскольку он возвращает скалярное значение. Этот вызов  принимает следующую общую форму.

<agg op name>   (   <relation exp>   [,   <attribute name>  ]   )

Если в качестве имени агрегирующей операции <адд ор пате> указано COUNT, то параметр с обозначением имени атрибута <attribute name> не  имеет  смысла и должен быть исключен; в противном случае он может быть исключен тогда и только тогда, когда реляционное выражение <relation exp> обозначает отношение степени один, и в этом случае по умолчанию  подразумевается использование единственного атрибута результата этого выражения <relation exp>. Ниже приведено несколько примеров.

SUM    (    SP WHERE    S#    =    S#     ( ‘ S 1 ‘ ) ,     QTY SUM (     (    SP  WHERE    S#    =    S#     ( ‘ S 1 ‘ )                                        )     {   QTY    }

)|

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

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

272     Часть II. Реляционная модель

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии