Представление, или VIEV, - некоторое подобие таблицы, содержание которого выбирается из других таблиц с помощью выполнения запроса, причем при изменении значений в этих таблицах, данные автоматически меняются и представлении.
Представление – это фактически тот же запрос, который выполняется всякий раз, когда представление участвует в какой-либо команде. Вывод этого запроса при этом в каждый момент времени становится содержанием представления.
Имеются две возможности реализации представления:
1. простое определение, то есть система формирует каждую запись представления по мере необходимости, постепенно считывая исходные данные с базовых таблиц;
2. сложное определение, то есть СУБД приходится сначала выполнить такую операцию, как материализация представления, т.е. сохранение информации, из которой состоит представление во временной таблице. Затем система приступает к выполнению пользовательской команды и формированию ее результатов, а после этого временная таблица удаляется.
18.1. Представление создаетсякомандой CREATE VIEV, после которой указывается его имя, а далее следует запрос, формирующий тело представления.
Пример 1. Создать представление OTLSTUD, которое содержит информацию о студентах, получающих стипендию в размере 25.50.
CREATE VIEVOTLSTUD
AS SELECT*
FROMSTUDIENTS
WHERESTIP=25.50;
Теперь полученное представление можно использовать как любую другую таблицу: она может быть запрошена, модифицирована, в нее могут быть ставлены записи, она может быть удалена из БД или соединена с другими таблицами и представлениями.
Представление теперь может изменяться командами модификации DML, но модификация не будет воздействовать на само представление. Фактически команды будут перенаправлены к базовой таблице.
Пример 5. какая из команд будет отвергнута системой.
UPDATESTIPOFF UPDATESTIPOFF
SETSIMA=’Василий’ SETSTIP=25.50
WHERE SNUM=3415; WHERESNUM=3415;
В представлениях нередко возникает необходимость называть столбцы новыми именами. Это может потребоваться в случае, если столбцы являются вводимыми, и поэтому не имеющими имен, или если два или более столбцов в объединении имеют те же имена, что и в базовой таблице. Имена, которые необходимо присвоить полям, записываются в круглых скобках после имени таблиц. Они могут не указываться, если совпадают с именами полей запрашиваемой таблицы.
Пример 6. Объясните, почему данные команды являются единичными:
SELECT * SELECT *
FROMOTLSUD FROMSTUDIENTS
WHERESNUM>3412; WHERESTIP=25.50
ANDSNUM>3412;
Пример 7. Создать представление, которое содержит данные о количестве студентов, получающих стипендию.
CREATE VIEVSTIPCOUNT (STIP, COL)
AS SELECTSTIP, COUNT(*)
FROMSTUDIENTS
GROUP BYSTIP;
18.2. Групповые представления – это представления которые содержат предложение GROUP BY или которые основаны на других групповых представлениях. Представления могут быть основаны сразу на нескольких базовых таблицах.
Пример 1. Создать представление, которое показывало бы оценки студента по учебному предмету, причем содержало бы не коды, а полные названия.
CREATE VIEVSTUDOSEN
AS SELECTTHIRD.UNUM, FIRST.SEAM, SECOND.PNAME, THIRD.OCENCA
FROMSTUDIENTS FIRST, PREDMET SECOND, USP THIRD
WHEREFIRST.SNUM=THIRD.SNUM
ANDSECOND.PNUM=THIRD.PNUM;
После этого легко ориентироваться в полученных оценках.
Пример 2. Получить подробную информацию об оценках студента Полякова.
Представления могут также использовать подзапросы, в том числе соотнесенные.
Пример 4. создать представление, в котором выводятся оценки по дисциплине выше средней по той же дисциплине.
CREATE VIEVAVGOC
AS SELECT *
FROMUSP FIRST
WHEREOCENKA >
(SELECT AVG(OCENKA)
FROMUSP SECOND
WHERE SECOND.PNUM=FIRST.PNUM);
Пример 5. извлечь данные из таблицы AVGOC.
SELECT *
FROMAVGOC;
Ограничения:
1. Представление должно основываться на одиночном запросе, поэтому объединение UNION не разрешается.
2. В представлениях не используется упорядочение ORDER BY.
18.3. Представление удаляетсякомандой
DROP VIEV<VIEV NAME>
При удалении представления пользователь должен являться его владельцем.
18.4. Модификация представленияпроисходит под управлением команд модификации языка DML – INSERT, UPDATEиDELETE.Если команды модификации языка представлении, то оно считается модифицируемым; в противном случае оно предназначено только для чтения при запросе.
Модифицируемое представление – это представление, в котором команда модификации может выполниться так, чтобы изменить только одну запись основной таблицы в каждый момент времени, не воздействуя на другие строки любой таблицы
Критерии, по которым определяют, является ли представление модифицируемым в SQL, следующие:
§ Представление должно основываться только на одной базовой таблице;
§ Оно должно содержать первичный ключ этой таблицы;
§ Оно не должно иметь никаких полей, которые бы являлись агрегатными функциями;
§ Оно не должно содержать DISTINCT в своем определении;
§ Представление не должно использовать GROUP BY или HAVING в своем определении;
§ Желательно, чтобы оно не использовало в своем определении подзапросы;
§ Оно не может быть использовано в другом представлении, но это представление должно также быть модифицируемым;
§ Оно не должно использовать константы, строки или выражения значений среди выбранных полей вывода;
§ Для команды INSERT оно может содержать любые поля основной таблицы, которые имеют ограничение NOT NULL, если другое ограничение по умолчанию не определенно.
Пример 1. определите, почему следующее представление является представлением только для чтения. Определите содержание таблицы.
CREATE VIEVPRCOUNT (UDATE, COL)
AS SELECTUDATE, COUNT (*)
FROMUSP
GROUP BYUDATE;
Пример 2. Определите, почему следующее представление является модифицируемым представлением. Определите содержание таблицы.
CREATE VIEVMATEMUSP
AS SELECT *
FROMUSP
WHEREPNUM=2003;
Пример 3. Определите характер представления и содержание таблицы.
CREATE VIEVIDXSTIP (SNUM, SFAM, NEWSTIP)
AS SELECTSNUM, SFAM, STIP*2
FROMSTUDIENTS
WHERESTIP=25.50;
Пример 4. Определите характер представления и содержание таблицы.
CREATE VIEVDATEOS
AS SELECT *
FROMSTUDENTS
WHERESNUM IN
(SELECTSNUM
FROMUSP
WHEREUDATE=10/06/1999);
Пример 5. Определите характер представления и содержание таблицы.
CREATE VIEW DATEOC2
AS SELECT *
FROM USP
WHERE UDATE IN (10/06/1999,11/06/1999);
Пример 6. Определите характер представления и содержание таблицы.
CREATE VIEVONLY 5
AS SELECTSNUM, OCENKA
FROMUSP
WHEREOCENKA=5;
18.5. Фраза WITH CHCK OPTIONпроизводит действие в режиме «все или ничего», так как она размещается в определении представления, и все команды модификации будут подвергаться проверке. Таким образом можно регулировать процесс ввода значений, которые пользователь впоследствии сам не в состоянии корректировать. Эта фраза применяется только в представлениях, которые основаны на базовых таблицах, а не на других представлениях.
Пример 1. создать представление о студентах, имеющих отличные оценки с использованием режима «все или ничего».
CREATE VIEVONLY5
AS SELECTSNUM, OCENCA
FROMUSP
WHEREOCENKA=5
WITH CHECK OPTION;
18.6. Курсор – это вид переменной, которая связана с запросом. Значением этой переменной может быть каждая строка, которая выводится при запросе и он должен быть объявлен командой DECLARE CURSOR.
Например, запрос
EXEC SQL DECLARE CURSORSTIPCUR
FOR SELECTSNUM, SFAM, STIP
FROMSTUDENTS
WHERESTIP=25.50;
Не выполняется немедленно, так как в данном случае представлено только его определение. В отличии от базовых таблиц и представлений, строки курсора упорядочены и имеются первая, вторая и т.д., а так же последняя строка. Этот порядок может быть произвольным с явным управлением при помощи фразы ORDER BY в запросе. Когда в программе необходимо выполнить запрос, то открывается курсор с помощью команды.
EXEC SQL OPEN CURSORSTIPCUR;
И только тогда передаются значения в курсор.
Команда FETCH используется для того, чтобы извлечь вывод из запроса по одной строке в каждый момент времени .
Следующая конструкция присвоит значения из первой выбранной сртоки в переменные памяти.
Как правило, команду FETCHпомещают внутрь цикла так, чтобы выбрав строку из курсора, можно было осуществить перемещение набора значений из этой строки в переменные, возвратиться обратно в цикл и переместить следующий набор значений в те же самые переменные.
Оператор CLOSE CURSORосвобождает курсор значений, поэтому после него запрос нужно будет выполнить повторно с оператором OPEN CURSOR,прежде чемперейти квыбору следующих значений.