|
Программирование >> Хронологические базы данных
Неформально говоря, тело полученного в результате выполнения этой операции отношения состоит из тех кортежей отношения А, которые не нашли соответствия в отношении В. Пример. Получить значения атрибутов St, SNAME, STATUS и CITY для всех поставшиков, не поставляюших деталь с номером Р2. S SEMIMINUS ( SP WHERE Pt = Pt ( P2 ) ) Операция расширения Читатель, возможно, заметил, что в описанной нами алгебре нет средств для скалярных вычислений. Конечно, на практике такие возможности просто необходимы. Например, может понадобиться запросить из базы данных результат вычисления некоторого арифметического выражения, подобного выражению WEIGHT*454, или сослаться на такое значение в выражении WHERE при выборке. (Вспомним, что в нашем примере вес деталей приведен в фунтах; тогда выражение WEIGHT*454 переводит этот вес в граммы.) Для обеспечения таких возможностей и предназначена операция расширения. Точнее, с ее помощью из определенного отношения (по крайней мере, концептуально) создается новое отношение. Оно похоже на начальное, но содержит дополнительный атрибут, значения которого получены посредством некоторых скалярных вычислений. Например, можно написать следующее. EXTEND Р ADD ( WEIGHT * 454 ) AS GMWT С помощью этого выражения (заметьте, именно выражения, а не команды или оператора, что разрешает вложение подобных выражений в другие выражения) создается новое отношение с таким же заголовком, как и у отношения Р, за исключением дополнительного атрибута GMWT. Каждый кортеж этого отношения совпадает с соответствующим кортежем отношения Р, но содержит еще одно дополнительное значение атрибута GMWT, вычисляемое в соответствии с указанным выражением, как показано на рис. 6.9.
Рис. 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 А 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 S# AS X ) WHERE X = S# ) AS NP Результат вычисления этого выражения показан на рис. 6.10.
Рис. 6. JO. Еще один пример операции расширения Пояснения Для данного поставщика в текущем значении переменной-отнощения S выражение ( ( SP RENAME S# AS X ) WHERE X = S# ) позволяет возвратить множество кортежей поставок, соответствующих кортежу поставщика в текущем значении переменной-отнощения SP. Затем для этого множества поставок применяется обобщающая функция COUNT, возвращающая соответствующее значение кардинальности (которое является, конечно же, скалярным значением). Атрибут NP в результирующем отнощений представляет количество деталей, которые поставляются поставщиком, определяемым соответствующим значением атрибута St. В частности, обратите внимание на значение атрибута NP для поставщика с номером S5 - множество кортежей отношения SP для этого поставщика пусто, поэтому функция COUNT возвращает значение нуль . Рассмотрим вкратце обобщающие функции. Общее назначение этих функций состоит в том, чтобы на основе значений некоторого атрибута определенного отношения получить скалярное значение. Типичными примерами являются функции COUNT, SUM, MAX, MIN, ALL и ANY. В языке Tutorial D параметр <вызов обобщающей функции> является особым случаем параметра <скалярное выражение> и в общем случае имеет следующий вид. <имя функции> ( <реляционное выражение> [, <имя атри6ута> ] ) Если параметр <имя функции> имеет значение COUNT, то параметр <имя атри6ута> недопустим и должен быть опущен. В остальных случаях параметр <имя атри6ута> может быть опущен тогда и только тогда, когда параметр <реляционное выражение> задает отношение со степенью, равной единице. Тогда единственный атрибут результирующего отношения, получаемого после вычисления выражения <реляционное выражение>, будет использоваться по умолчанию. Вот несколько примеров.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |