Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных Язык SQL.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

4.5.2 Создание и удаление представлений

Поскольку представление является объектом базы данных, для его создания используется стандартная команда языка DDL CREATE…

Create VIEW имя [(список_столбцов)]

as

select …// любой запрос на выборку

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

Например, создадим представление, содержащее столбцы «код студента, фамилия студента, его средний балл» :

Create VIEW stud_mark (cod_st, name_st, avg_mark)

as

select st.cod_st, st.name_st, avg(m.mark)

from students st left join marks m

on st.cod_st=m.cod_st

GROUP BY st.cod_st, st.name_st

При создании представления пользователю не возвращается виртуальная таблица, которую он обычно получает при выполнении SELECT… Вместо этого, он получит лаконичное сообщение типа «Представление создано».

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

Select * from stud_mark

Можно написать и любой другой запрос на выборку к представлению:

Select cod_sub, avg_mark from stud_mark

where cod_st=123

Удаляется представление также стандартными средствами DDL:

DROP VIEW имя_представления

Выполнив последовательно команды DROP VIEW…, а затем снова CREATE VIEW … с тем же самым запросом SELECT, мы не напрасно потеряем время. Во многих случаях СУБД сформирует новый план исполнения того же самого запроса в соответствии с изменившимся наполнением таблиц или появлением новых индексов. Это приведет к сокращению времени материализации представления.

СУБД Oracle позволяет изменить план исполнения запроса без удаления представления, используя команду:

alter VIEW имя recomplile

4.5.3 Обновление представлений

На некоторые представления можно писать запросы Update, Delete и Insert, как на обычные таблицы. При выполнении таких запросов реально все изменения вносятся в физические таблицы.

Такие представления называются обновляемыми. Согласно стандарту SQL, обновляемыми являются представления, основанные на запросах:

  1. только по одной таблице

  2. запрос не должен содержать ключевых слов DISTINCT, GROUP BY, HAVING

  3. не должен содержать вложенных запросов

  4. не должен быть комбинированным, т.е. недолжен содержать операций UNION, INTERSECT, EXCEPT (MINUS).

Oracle, дополнительно, не позволяет обновлять запросы с сортировкой результатов.

Таким образом, обновляемых представлений не так и много:

  • представления с отбором столбцов (вертикальные представления)

  • представления с отбором строк (горизонтальные представления)

  • представления с отбором строк и столбцов (смешанные представления).

Например, создадим горизонтальное представление на основе выборки из таблицы оценок marks, содержащее только оценки по Математике.

Предварительно мы выяснили из таблицы предметов subjects, что математика имеет код 1.

Тогда для создания представления потребуется выполнить команду:

Create VIEW mark_1

as

select * FROM marks

WHERE cod_sub=1

Это представление будет обновляемым, поэтому преподаватель математики, которому разрешено обновление этого представления, может изменить любую (одну) оценку, например, таким запросом:

UPDATE mark_1 SET mark=5 WHERE cod_st=123

Однако, запрос:

UPDATE mark_1 SET cod_sub=2 WHERE cod_st=123

который также, как и первый, является разрешенным, приведет к неожиданным последствиям. Обновленная строка окажется за пределами представления mark_1 и запрос:

SELECT * FROM mark_1

эту строку не покажет.

Если такой побочный эффект нежелателен, в команду CREATE VIEW … следует добавить дополнительную фразу WITH CHECK OPTION:

DROP VIEW mark_1

Create VIEW mark_1

as

select * FROM marks WHERE cod_sub=1

WITH CHECK OPTION

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

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