- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
17.3. Определение данных
Общий синтаксис инструкции определения представления CREATE VIEW выглядит следующим образом:
CREATE VIEW имя AS выражение ;
В приведенном выражении имя обозначает имя представления, а выражение (выражение реляционной алгебры или реляционного исчисления) является определением представления. Аналогично инструкция CREATE VIEW комбинирует функцию внешней схемы и функцию концептуальной схемы (использована терминология ANSI/SPARC из главы 2), так как эта инструкция определяет вид внешних объектов и их отображение на концептуальном уровне.
Ниже приведены примеры, записанные для определенности в синтаксисе реляционной алгебры.
1. CREATE VIEW REDPARTS AS
((P WHERE COLOR ='Red') [P#,PNAME,WEIGHT,CITY])
RENAME WEIGHT AS WT;
Вычисление этого выражения приведет к созданию представления REDPARTS, которое содержит кортежи с данными о деталях только красного цвета. Эти кортежи обладают четырьмя атрибутами: Р#, PNAME, WT и CITY, которые соответствуют атрибутам Р#, PNAME, WEIGHT и CITY исходного отношения Р.
Замечание. Атрибут WEIGHT переименован в примере только ради демонстрации такой возможности, явной необходимости в этом не было.
2. CREATE VIEW PQ AS
SUMMARIZE SP BY( P# )ADD SUM ( QTY ) AS TOTQTY ;
В отличие от предыдущего примера (с представлением REDPARTS), представление в данном примере не является простым подмножеством исходного отношения (например, выборкой или проекцией). Это представление можно рассматривать как статистический итог или сжатие исходного отношения.
3. CREATE VIEW CITY_PAIRS AS
( ( S RENAME CITY AS SCITY ) JOIN SP JOIN
( P RENAME CITY AS PCITY ) ) [ SCITY, PCITY ] ;
Данное представление было описано выше в этой главе. Как уже упоминалось, пара имен городов (х, у) появляется в представлении тогда и только тогда, когда поставщик, находящийся в городе х, поставляет детали, которые хранятся в городе у. Например, поставщик S1 поставляет детали Р1; поставщик S1 расположен в Лондоне и поставляемые им детали хранятся в Лондоне. Таким образом, пара имен (Лондон, Лондон) появляется в представлении.
4. CREATE VIEW LONDON_REDPARTS AS
REDPARTS WHERE CITY = 'London' ;
Поскольку подобные выражения могут ссылаться на представления так же, как и на отношения, можно совершенно спокойно определять новые представления с помощью уже существующих представлений.
Инструкция DESTROY VIEW имеет следующий синтаксис:
DESTROY VIEW имя ;
В результате вычисления этого выражения представление с именем имя будет уничтожено (т.е. его определение будет удалено из системного каталога). Ниже приведен пример использования такой операции:
DESTROY VIEW REDPARTS ;
В главе 4 показано, что операция destroy base relation завершится неудачей, если существует хотя бы одно определение представления (или снимка (snapshot)), в котором используется удаляемое отношение. Аналогично, операция destroy view завершится неудачей, если определение какого-либо представления (или снимка) ссылается на удаляемое представление. Дополнительно в инструкции create view (и create snapshot) можно использовать инструкции restricted или cascades. Инструкция restricted означает, что попытка удалить исходные отношения потерпит неудачу, a cascades — что подобная попытка будет завершена успешно, после чего "по каскаду" будут удалены все представления (и снимки данных///). Инструкция restricted применяется по умолчанию.
///////// Стандарт SQL [8.1] не поддерживает инструкций RESCTRICTED и CASCADES; эти инструкции включены в DROP TABLE и DROP VIEW (соответственно инструкциям DESTROY BASE RELATION и DESTROY VIEW). Но инструкция CREATE VIEW не поддерживает инструкций RESTRICTED и CASCADES. Для них в стандарте SQL не предусмотрено значения по умолчанию и нужно явно указывать одну из инструкций.///////