Представления

Представление, или VIEV, - некоторое подобие таблицы, содержание которого выбирается из других таблиц с помощью выполнения запроса, причем при изменении значений в этих таблицах, данные автоматически меняются и представлении.

Представление – это фактически тот же запрос, который выполняется всякий раз, когда представление участвует в какой-либо команде. Вывод этого запроса при этом в каждый момент времени становится содержанием представления.

Имеются две возможности реализации представления:

1. простое определение, то есть система формирует каждую запись представления по мере необходимости, постепенно считывая исходные данные с базовых таблиц;

2. сложное определение, то есть СУБД приходится сначала выполнить такую операцию, как материализация представления, т.е. сохранение информации, из которой состоит представление во временной таблице. Затем система приступает к выполнению пользовательской команды и формированию ее результатов, а после этого временная таблица удаляется.

18.1. Представление создается командой CREATE VIEV, после которой указывается его имя, а далее следует запрос, формирующий тело представления.

Пример 1. Создать представление OTLSTUD, которое содержит информацию о студентах, получающих стипендию в размере 25.50.

CREATE VIEV OTLSTUD

AS SELECT*

FROM STUDIENTS

WHERE STIP=25.50;

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

Пример 2.Вывести результат запроса

SELECT *

FROM OTLSTUD

Результат запроса:

SNUM SFAM SIMA SOTCH STIP

-------------------------------------------------------------------------------------------

3412 Поляков Анатолий Алексеевич 25.50

3416 Нагорный Евгений Васильевич 25.50

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

Пример 3. Создать представление, в котором скрывается от пользователя размер стипендии.

CREATE VIEV STIPOFF

AS SELECT SNUM, SFAM, SIMA, SOTCH

FROM STUDIENTS

Пример 4. Вывести содержимое таблицы STIPOFF

SELECT *

FROM STIPOFF

Результат запроса:

SNUM SFAM SIMA SOTCH

-------------------------------------------------------------

3412 Поляков Анатолий Алексеевич

3413 Старова Любовь Михайловна

3414 Гриценко Владимир Николаевич

3415 Котенко Анатолий Николаевич

3416 Нагорный Евгений Васильевич

Представление теперь может изменяться командами модификации DML, но модификация не будет воздействовать на само представление. Фактически команды будут перенаправлены к базовой таблице.

Пример 5. какая из команд будет отвергнута системой.

UPDATE STIPOFF UPDATE STIPOFF

SET SIMA=’Василий’ SET STIP=25.50

WHERE SNUM=3415; WHERE SNUM=3415;

В представлениях нередко возникает необходимость называть столбцы новыми именами. Это может потребоваться в случае, если столбцы являются вводимыми, и поэтому не имеющими имен, или если два или более столбцов в объединении имеют те же имена, что и в базовой таблице. Имена, которые необходимо присвоить полям, записываются в круглых скобках после имени таблиц. Они могут не указываться, если совпадают с именами полей запрашиваемой таблицы.

Пример 6. Объясните, почему данные команды являются единичными:

SELECT * SELECT *

FROM OTLSUD FROM STUDIENTS

WHERE SNUM>3412; WHERE STIP=25.50

AND SNUM>3412;

Пример 7. Создать представление, которое содержит данные о количестве студентов, получающих стипендию.

CREATE VIEV STIPCOUNT (STIP, COL)

AS SELECT STIP, COUNT(*)

FROM STUDIENTS

GROUP BY STIP;

18.2. Групповые представления – это представления которые содержат предложение GROUP BY или которые основаны на других групповых представлениях. Представления могут быть основаны сразу на нескольких базовых таблицах.

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

CREATE VIEV STUDOSEN

AS SELECT THIRD.UNUM, FIRST.SEAM, SECOND.PNAME, THIRD.OCENCA

FROM STUDIENTS FIRST, PREDMET SECOND, USP THIRD

WHERE FIRST.SNUM=THIRD.SNUM

AND SECOND.PNUM=THIRD.PNUM;

После этого легко ориентироваться в полученных оценках.

Пример 2. Получить подробную информацию об оценках студента Полякова.

SELECT *

FROM STUDOSEN

WHERE SFAM=’Поляков’;

Результат запроса:

UNUM SFAM PNAME OCENKA

--------------------------------------------------------------------

1001 Поляков Физика 5

1004 Поляков Математика 4

Так же допускается объединение представления с другими базовыми таблицами или представлениями.

Пример 3. Вывести информацию об оценках и дате их получения студента Полякова.

SELECT SFAM, PNAME, OCENCA,UDATE

FROM STUDOSEN FIRST, USP SECOND

WHERE FIRST.SFAM=’Поляков’

AND FIRST.UNUM=SECOND.UNUM;

Результат запроса:

SFAM PNAME OCENCA UDATE

-----------------------------------------------------------------

Поляков Физика 5 10/06/1999

Поляков Математика 4 12/06/1999

Представления могут также использовать подзапросы, в том числе соотнесенные.

Пример 4. создать представление, в котором выводятся оценки по дисциплине выше средней по той же дисциплине.

CREATE VIEV AVGOC

AS SELECT *

FROM USP FIRST

WHERE OCENKA >

(SELECT AVG (OCENKA)

FROM USP SECOND

WHERE SECOND.PNUM=FIRST.PNUM);

Пример 5. извлечь данные из таблицы AVGOC.

SELECT *

FROM AVGOC;

Ограничения:

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 VIEV PRCOUNT (UDATE, COL)

AS SELECT UDATE, COUNT (*)

FROM USP

GROUP BY UDATE;

Пример 2. Определите, почему следующее представление является модифицируемым представлением. Определите содержание таблицы.

CREATE VIEV MATEMUSP

AS SELECT *

FROM USP

WHERE PNUM=2003;

Пример 3. Определите характер представления и содержание таблицы.

CREATE VIEV IDXSTIP (SNUM, SFAM, NEWSTIP)

AS SELECT SNUM, SFAM, STIP*2

FROM STUDIENTS

WHERE STIP=25.50;

Пример 4. Определите характер представления и содержание таблицы.

CREATE VIEV DATEOS

AS SELECT *

FROM STUDENTS

WHERE SNUM IN

(SELECT SNUM

FROM USP

WHERE UDATE=10/06/1999);

Пример 5. Определите характер представления и содержание таблицы.

CREATE VIEW DATEOC2

AS SELECT *

FROM USP

WHERE UDATE IN (10/06/1999,11/06/1999);

Пример 6. Определите характер представления и содержание таблицы.

CREATE VIEV ONLY 5

AS SELECT SNUM, OCENKA

FROM USP

WHERE OCENKA=5;

18.5. Фраза WITH CHCK OPTION производит действие в режиме «все или ничего», так как она размещается в определении представления, и все команды модификации будут подвергаться проверке. Таким образом можно регулировать процесс ввода значений, которые пользователь впоследствии сам не в состоянии корректировать. Эта фраза применяется только в представлениях, которые основаны на базовых таблицах, а не на других представлениях.

Пример 1. создать представление о студентах, имеющих отличные оценки с использованием режима «все или ничего».

CREATE VIEV ONLY5

AS SELECT SNUM, OCENCA

FROM USP

WHERE OCENKA=5

WITH CHECK OPTION;

18.6. Курсор – это вид переменной, которая связана с запросом. Значением этой переменной может быть каждая строка, которая выводится при запросе и он должен быть объявлен командой DECLARE CURSOR.

Например, запрос

EXEC SQL DECLARE CURSOR STIPCUR

FOR SELECT SNUM, SFAM, STIP

FROM STUDENTS

WHERE STIP=25.50;

Не выполняется немедленно, так как в данном случае представлено только его определение. В отличии от базовых таблиц и представлений, строки курсора упорядочены и имеются первая, вторая и т.д., а так же последняя строка. Этот порядок может быть произвольным с явным управлением при помощи фразы ORDER BY в запросе. Когда в программе необходимо выполнить запрос, то открывается курсор с помощью команды.

EXEC SQL OPEN CURSOR STIPCUR;

И только тогда передаются значения в курсор.

Команда FETCH используется для того, чтобы извлечь вывод из запроса по одной строке в каждый момент времени.

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

EXEC SQL FETCH STIPCUR INTO STUDENTSID,: STUDENTSFAM,: STUDENTSSTIP;

Как правило, команду FETCH помещают внутрь цикла так, чтобы выбрав строку из курсора, можно было осуществить перемещение набора значений из этой строки в переменные, возвратиться обратно в цикл и переместить следующий набор значений в те же самые переменные.

Оператор CLOSE CURSOR освобождает курсор значений, поэтому после него запрос нужно будет выполнить повторно с оператором OPEN CURSOR, прежде чемперейти квыбору следующих значений.

В нашем случае этот оператор имеет вид:

EXEC SQL CLOSE CURSOR STIPCUR;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: