где
■ OR REPLACE указывает, что представление должно заменить существующее
представление, если такое существует;
■ FORCE означает, что представление должно быть создано, даже если
нет базовых таблиц;
■ N0F0RCE означает, что представление не должно быть создано, если
нет базовых таблиц; значением по умолчанию является N0F0RCE;
■ имя_лредст определяет имя представления;
■ имя_псевдонима определяет имя псевдонима для выражения из подзапроса.
Число псевдонимов должно быть равно числу выражений в
подзапросе;
■ подзапрос определяет подзапрос, используемый для выборки из базовых
таблиц. Если псевдонимы заданы, их можно использовать в списке
после фразы SELECT;
■ WITH CHECK OPTION определяет, что могут быть вставлены, обновлены
или удалены только строки, которые потом смогут быть отобраны
подзапросом. По умолчанию, перед тем как они вставляются, обновляются
или удаляются, строки не проверяются на предмет возможности
их выборки подзапросом;
■ имя_огр указывает имя ограничения WITH CHECK OPTION или READ
ONLY;
■ WITH READ ONLY означает, что строки из базовых таблиц можно только
читать.
Есть два основных типа представлений.
■ Простые представления, которые содержат подзапрос, осуществляющий
выборку из одной базовой таблицы.
■ Сложные представления, содержащие подзапрос, который:
■ осуществляет выборку из нескольких базовых таблиц;
■ группирует строки, используя фразы GROUP BY или DISTINCT;
■ содержит вызовы функций.
В следующих разделах вы узнаете, как создавать и использовать эти типы
представлений.
Привилегия для представлений
Чтобы создать представление, пользователь должен иметь привилегию
CREATE VIEW. Следующий пример использует пользователя system для предоставления
привилегии CREATE VIEW пользователю store:
□ CONNECT system/manager
GRANT CREATE VIEW TO store;
Создание и использование простых представлений
Простые представления обращаются к одной базовой таблице. Следующий
пример выполняет подключение под пользователем store и создает
Создание таблиц, последовательностей, индексов и представлений 341
представление с именем cheap_products_view, подзапрос которого отбирает
только те товары, цена которых меньше $15:
□ CONNECT store/store_password
CREATE VIEW cheap_products_view AS
SELECT *
FROM products
WHERE price < 15;
В следующем примере создается представление employees_view, подзапрос
которого отбирает все столбцы таблицы employees за исключением
salary:
□ CREATE VIEW employees_view AS
SELECT employee_id, manager_id, first_name, last_name, t i t l e
FROM employees;
Выполнение оператора SE LECT для представления
После создания представления его можно использовать для доступа к базовой
таблице. В следующем примере выполняется оператор SELECT для
представления cheap_p rod.ucts_view:
□ SELECT product_id, name, price
FROM cheap_products_view;
ID NAME PRICE
4 Tank War 13.95
6 2412: The Return 14.95
7 Space Force 9 13.49
8 From Another Planet 12.99
9 Classical Music 10.99
11 Creative Yell 14.99
12 My Front Line 13.49
В следующем примере производится выборка из employees_view:
□ SELECT *
FROM employees_view;
EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME TITLE
1 James Smith CEO
2 1 Ron Johnson Sales Manager
3 2 Fred Hobbs Salesperson
4 2 Susan Jones Salesperson
Выполнение оператора IN S E R T с помощью представления
С помощью представления cheap_products_view можно также выполнять
операции DML. В следующем примере выполняется вставка в cheap_
products_view, а затем выбирается эта строка:
□ INSERT INTO cheap_products_view (
product_id, product_type_id, name, price
) VALUES (
342 Глава 10
13, 1, ‘Western Front’ , 13.50
);
1 row created.
SELECT product_id, name, price
FROM cheap_products_view
WHERE product_id = 13;
PR0DUCT_ID NAME PRICE
13 Western Front 13.5
Примечание Операции DML можно выполнять только для простых представлений. Сложные
представления не поддерживают DML.
Поскольку представление cheap_products_view не использует опцию
WITH CHECK OPTION, можно вставлять, обновлять и удалять строки, которые
не могут быть отобраны представлением. В следующем примере вставляется
строка, в которой задана цена товара $16.50, что превышает $15, и
поэтому такая строка це может быть отобрана представлением:
□ INSERT INTO cheap_products_view (
product_id, product_type_id, name, price
) VALUES (
14, 1, ‘ Eastern Front’ , 16.50
);
1 row created.
SELECT *
FROM cheap_product_view
WHERE product_id = 14;
no rows selected
Представление employees_view содержит подзапрос, отбирающий из
таблицы employees все столбцы за исключением salary. При выполнении
вставки с помощью employees_view столбец salary в базовой таблице
employees будет установлен в NULL: