ВВЕДЕНИЕ
Напомним из главы 1, что представление—это виртуальная таблица, т. е. таблица, которая сама по себе не существует, но для пользователя выглядит таким образом, как будто она существует. В противоположность этому базовая таблица — это реальная таблица в том смысле, что для каждой строки такой таблицы в действительности имеется некоторый хранимый двойник этой строки в физической памяти (см. главу 13). Представления не поддерживаются их собственными физически отдельными различимыми хранимыми данными. Вместо этого в каталоге (фактически в таблице каталога SYSVIEWS) хранится их определение в терминах других таблиц. Ниже приводится пример представления:
CREATE VIEW ХОРОШИЕ_ПОСТАВЩИКИ
AS SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД
FROM S
WHERE СОСТОЯНИЕ > 15;
Когда исполняется это предложение CREATE VIEW(создать представление), подзапрос, следующий за AS, являющийся фактически определением данного представления, не исполняется. Вместо этого он просто сохраняется в каталоге. Но для пользователя дело обстоит теперь таким образом, как будто бы в базе данных в действительности существует таблица, называемая ХОРОШИЕ_ПОСТАВЩИКИ, строки и столбцы которой показаны в необведенной пунктиром части рис. 8.1. ХОРОШИЕ_ПОСТАВЩИКИ представляет собой фактически «окно» в реальную таблицу S. Более того, это окно является динамическим: изменения в S будут автоматически и немедленно видны через это окно при условии, конечно, что эти изменения относятся к необведенной пунктиром части таблицы S. Подобным же образом изменения, внесенные в ХОРОШИЕ_ПОСТАВЩИКИ, будут автоматически и немедленно осуществлены и в реальной таблице S (см. ниже раздел 8.4).
Далее, в зависимости от искушенности пользователя и, возможно, также от рассматриваемого приложения, пользователь может или не может реализовать ХОРОШИЕ_ПОСТАВЩИКИ действительно как представление. Некоторые пользователи могут быть осведомлены об этом факте, а также о том, что имеется лежащая в основе этого представления реальная таблица S; другие могут искренне полагать, что ХОРОШИЕ_ПОСТАВЩИКИ — это сама «реальная» таблица. В любом случае нет никакой разницы Смысл заключается в том, что пользователь может производить операции над представлением ХОРОШИЕ_ПОСТАВЩИКИ точно так же, как если бы это была реальная таблица, за некоторыми исключениями, которые будут обсуждаться позже. Ниже приведен пример операции выборки данных (предложение SELECT) применительно к представлению ХОРОШИЕ_ПОСТАВЩИКИ:
SELECT *
FROM ХОРОШИЕ_ПОСТАВЩИКИ
WHERE ГОРОД Ø= 'Лондон';
ХОРОШИЕ_ ПОСТАВЩИКИ | НОМЕР_ ПОСТАВЩИКА | ФАМИЛИЯ | СОСТОЯНИЕ | ГОРОД |
S1 | Смит | Лондон | ||
S2 | Джонс | Париж | ||
S3 | Влеик | Париж | ||
S4 | Кларк | Лондон | ||
S5 | Адамс | Атенс |
Рис. 8.1.ХОРОШИЕ_ПОСТАВЩИКИ как представление базовой таблицы S (необведенная пунктиром часть)
Нетрудно видеть, что это предложение безусловно выглядит точно так же, как обычное SELECT, оперирующее обычной базовой таблицей. Система, а фактически генератор планов прикладных задач, выполняет такую операцию, преобразуя ее в эквивалентную операцию над лежащей в основе базовой таблицей (или множеством таблиц, см. раздел 8.2). Такая эквивалентная операция для приведенного примера:
SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД
FROM S
WHERE ГОРОД = 'Лондон'
AND СОСТОЯНИЕ> 15;
Это новое предложение может быть теперь скомпилировано, т. е. связано, и обычным образом исполнено. Преобразование, о котором говорилось выше, фактически делается путем слияния изданного пользователем предложения SELECT с предложением SELECT, которое было сохранено в каталоге при определении данного представления. Из каталога система знает, что FROM ХОРОШИЕ_ПОСТАВЩИКИ в действительности означает FROM S. Она знает также, что любая выборка из ХОРОШИЕ_ПОСТАВЩИКИ должна быть далее уточнена условием WHERE СОСТОЯНИЕ>15. Наконец, она знает также, что «SELECT *» для ХОРОШИЕ_ПОСТАВЩИКИ в действительности означает SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД (из таблицы S). Следовательно, система способна транслировать первоначальное предложение SELECT, относящееся к виртуальной таблице ХОРОШИЕ_ПОСТАВЩИКИ, в эквивалентное предложение SELECT, оперирующее с реальной таблицей S,— эквивалентное в том смысле, что результат исполнения этого SELECT для реальной таблицы S такой же, как если бы в действительности имелась базовая таблица, называемая ХОРОШИЕ_ПОСТАВЩИКИ, и первоначальное предложение SELECT выполнялось бы по отношению к ней.
Подобным же образом интерпретируются операции обновления. Например, операция
UPDATE ХОРОШИЕ_ПОСТАВЩИКИ
SET СОСТОЯНИЕ = СОСТОЯНИЕ +10
WHERE ГОРОД ='Париж';
будет преобразована генератором планов прикладных задач в следующую:
UPDATE S
SET СОСТОЯНИЕ = СОСТОЯНИЕ +10
WHERE ГОРОД = 'Париж'
AND СОСТОЯНИЕ > 15;
Аналогично интерпретируются операции INSERT и DELETE.