Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по серверам.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
748.54 Кб
Скачать
    1. Создание, удаление и обновление представлений

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

Создание представлений рассматривается на примере БД, содержащей следующие таблицы:

STUDENTS (NOM_ZACH,SFAM,SNAME, STIP)

PREDM (PKOD, PNAME, TNUM, HOURS, COURS)

PREP (TNUM,TFAM,TNAME, TSIRNAME)

USP (NOM_ZACH, PKOD, TNUM,UDATE, MARK)

Например, для создания представления о студентах, получивших стипендию в размере выше 70 рублей можно использовать следующую команду

CREATE VIEW OTLSTUD

AS SELECT *

FROM STUDENTS

WHERE STIP > 70;

В БД теперь существует представление с именем OTLSTUD, которое можно использовать также как любую таблицу. Это представление является горизонтальным, так как оно позволяет ограничить доступ пользователей к определенным строкам.

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

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

CREATE VIEW STIPOFF

AS SELECT NOM_ZACH, SFAM, SNAME

FROM STUDENTS;

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

UPDATE STIPOFF

SET SNAME=”Степан”

WHERE NOM_ZACH= 200201;

аналогично выполнению той же команды для таблицы STUDENTS.

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

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

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

Когда делается запрос к представлению, то на самом деле система обращается к базовым таблицам. Например, при выполнении команды

SELECT *

FROM OTLSTUD

WHERE SNUM > 200201;

СУБД фактически осуществляет следующий запрос:

SELECT *

FROM STUDENTS

WHERE STIP >30 and SNUM > 200201;

Однако иногда возникают ситуации, когда появляются проблемы с представлением в результате комбинации из 2-х допустимых предикатов, которые не будут работать. В качестве иллюстрации создадим представление, которое содержит данные о количестве студентов, получающих ту или иную стипендию:

CREATE VIEW STIPCOUNT(STIP,KOL)

AS SELECT STIP,COUNT (*)

FROM STUDENTS

GROUP BY STIP;

Теперь обратимся к этому представлению, чтобы выяснить, есть ли такой размер стипендии, который получен двумя студентами:

SELECT *

FROM STIPCOUNT

WHERE COL =2;

Если запрос к представлению преобразовать к запросу к исходной таблице, то, скорее всего, будет получено

SELECT STIP,COUNT(*)

FROM STUDENTS

WHERE COUNT(*)=2

GROUP BY STIP;

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

SELECT STIP,COUNT(*)

FROM STUDENTS

GROUP BY STIP;

HAVING COUNT(*)=2;

Однако SQL может не выполнить такого превращения. В этом случае следует проверить, справляется ли используемая СУБД с аналогичными запросам, и в соответствии с этим формировать запросы к представлениям.

В SQL существует понятие групповых представлений, то есть таких, которые содержат предложение GROUP BY или которые основаны на других групповых представлениях. Предыдущий пример представления как раз относится к числу групповых представлений. Теперь каждый раз, когда требуется получить количество студентов, получающих ту или иную стипендию, достаточно просто выбрать все записи рассматриваемого представления вместо того, чтобы создавать достаточно сложный запрос.

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

CREATE VIEW STUDOCEN

AS SELECT STUDENTS.SFAM ,PREDM.PNAME, USP.MARK

FROM STUDENTS,PREDM,USP

WHERE STUDENTS.NOM_ZACH=USP.NOM_ZACH

AND USP.PKOD= PREDM.PKOD;

С помощью такого представления можно выводить оценки для любого студента, например,

SELECT *

FROM STUDOCEN

WHERE SFAM=”Иванов”;

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

SELECT SFAM,PNAME,OCENKA, UDATE

FROM STUDOCEN,USP

WHERE STUDENTS.SFAM=”Иванов”;

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

CREATE VIEW AVGOC

AS SELECT *

FROM USP A

WHERE MARK > (SELECT AVG(MARK)

FROM USP B

WHERE A.PCOD=B.PCOD);

Извлечение данных осуществляется запросом:

SELECT *

FROM AVGOC;