Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_лекции_Саладаев.doc
Скачиваний:
55
Добавлен:
03.05.2015
Размер:
15.75 Mб
Скачать

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

Допустим, мы имеем представление:

CREATEVIEWSalesown

AS SELECT snum, sname, city

FROM Salespeople;

По сути, оно просто ограничивает доступ к таблице Salespeopleтремя полями.

Это представление можно модифицировать командами обновления DML. Следует понимать, что при этом модификации воздействуют только на лежащую в его основе таблицу:

UPDATE Salesown

SET city = ‘Polo Alto’

WHEREsnum= 1004;

Групповые представления.

Это представления, которые в своем запросе содержат GROUPBY.

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

Вместо сложного запроса можно сначала сконструировать представление:

CREATE VIEW Total for day

AS SELECT odate, COUNT (DISTINCT cnum),

COUNT (DISTINCT cnum), COUNT (onum), AVG (amt),

SUM (amt)

FROM Orders

GROUP BY odate;

Теперь можно получить необходимую информацию с помощью простейших запросов:

SELECT* здесь просто указывать что конкретно

FROMTotalforday;

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

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

(не путать с объединениями UNION).

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

CREATE VIEW Nameorders

AS SELECT onum, amt, a.snum, sname, cname

FROM Orders a, Customers b, Sales people c

WHERE a.cnum = b.cnum

AND a.snum = c.snum;

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

SELECT *

FROM Nameorders

WHERE sname = ‘Ivanov’;

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

выражение

SELECTa.sname,cname,amt*comm

FROM Nameorders a, Sales people b

WHERE a.sname = ‘Petrov’

AND b.snum = a.snum;

Представления и подзапросы.

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

CREATE VIEW EliteS

AS SELECT b.odate, a,snum, a.sname

FROM Sales people a, Orders b

WHERE a.snum = b.snum

AND b.amt = (SELECT MAX (amt)

FROM Orders c

WHERE c.odate = b.odate);

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

CREATE VIEW Bonus

AS SELECT DISTINCT snum, sname

FROMEliteSaсчитает число строк

WHERE 10< = (SELECT COUNT (*)

FROM EliteS B

WHERE a.snum = b.snum);

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

SELECT*

FROMBonus;

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