Глава 20. Введение в представления
FROM Elitesalesforce а
WHERE 10 <=
(SELECT-COUNT (•)
FROM Elitesalesforce Ь
WHERE a.snum = b.snum);
Извлечь из этой таблицы продавца, получившего вознаграждение, можно, введя
следующий запрос:
SELECT •
FROM Bonus;
Д.1я того чтобы извлечь такую информацию с использованием RPG или COBOL, потребовалась бы довольно большая программа. В SQL мы использовали для этого
две сравнительно сложные команды, которые хранятся как определение представле
ния и один простой запрос. Все, что нужно делать ежедневно, - это выполнять по следний элементарный запрос, поскольку информация, которую он извлекает,
отражает текущее состояние базы данных.
Что нельзя сделать с помощью представлений?
Существует много типов представлений (включая примеры, рассмотренные в этой главе), которые выполняют только чтение. Это значит, что для них могут быть сформу лированы запросы, но их нельзя использовать в качестве объекта для команд обновле ния (эта тема рассматривается подробнее в главе 21).
Существует несколько аспеь."Тов в области запросов, которые не укладываются в рамки определений представления: единственное представление должно базироваться на единственном запросе; UNION и UNION ALL недопустимы. ORDER ВУ тоже нельзя использовать в определении представления. Выходные данные для запроса, формирующего представление, должны быть неупорядоченными по определению.
Удаление представлений
Синтаксис исключения представления из базы данных сходен с синтаксисом для исключения базовых таблиц:
DROP VIEW <имя представления>
Здесь нет необходимости сначала удалить все содержимое, как это требовалось для базовых таблиц, поскольку содержимое представления никогда явно не определяется, а сохраняется в процессе выполнения отдельной команды. На базовые таблицы, на ос
нове которых определено представление, команда никакого действия не оказывает. Надо помнить, что только владелец имеет полномочия.
220
Итоги
Итоги
Теперь вы можете использовать представления. Почти все, что можно создать
спонтанно с помощью запроса, определяется в виде постоянного представления. За просы для этих представлений являются, по сути, запросами к запросам. Представле ния широко применяются на практике для удобства, для поддержания защиты, для форматирования и вывода значений и даже для изменения содержимого базы данных. Еще один важный вопрос, касающийся представлений, - их обновляемость, которая по мере обновления базовых таблиц возможна не во всех случаях. Подробнее мы по говорим об этом в главе 21 .
221
Работае.м на SQL
l. Создайте представление, показывающее всех покупателей с наивысшими рей
тингами.
2.Создайте таблицу, которая показывает количество продавцов в каждом городе.
3.Создайте представление, которое показывает общее и среднее количество заявок
для каждого продавца после его имени. Предполагается, что все имена являются
уникальными.
4.Создайте представление, которое показывает каждого продавца вместе со всеми
его покупателями.
(Ответы см. в приложении А.)
222
Изменение значений
с помощью
представлений
Глава 21. Изменение з11ачений с помощью представлений
В этой главе речь идет о командах обновления DML - INSERT, UPDATE и
DELETE - применительно к представлениям. Как упоминалось ранее, использова ние команд обновления в представлениях является опосредованным способом приме нения их для таблиц, на которые ссылаются запросы, соответствующие представлениям. Не все представления можно обновлять. Вы ознакомитесь с прави лами, в соответствии с которыми можно определить, подлежит ли представление об новлению, а также с вопросами их практического применения. Вы научитесь употреблять предложение WIТH СНЕСК OPТION, управляющее специфическими значениями, которые можно ввести в таблицу, используя представление. В некоторых
случаях это может оказаться желательной альтернативой непосредственным ограни
чениям таблицы.
Обновление представлений
Одним из наиболее сложных и неоднозначных аспектов представлений является их применение в командах обновления DML. Эти команды непосредственно воздейству ют на базовую таблицу представления, что создает своего рода противоречие. Пред ставление состоит из результатов запроса, и при его обновлении обновляется все множество результатов запросов. Оно воздействует на значения в таблице (в табли цах), для которых выполняется запрос, и, следовательно, изменяет его выходные дан ные, не воздействуя на запрос как таковой. Следующее предложение создаст представление, показанное на рис. 21.1:
CREATE VIEW Citymatch (custcity, salescity)
AS SELECT DISTINCT a.city, b.city
FROM Customeгs а, Salespeople Ь
WHERE a.snum = b.snum;
Представление показывает все пары покупателей с продавцами или, по крайней мере, одного покупателя в городе custcity, который обслуживается продавцом из горо
да salescity.
Например, одна строка этой таблицы - Loпdon London - определяет, что имеет ся, по крайней мере, один покупатель в Лондоне, которого обслуживает продавец из Лондона. Эта строка относится к паре Hoffшan с его продавцом Рее\, оба они из Лон дона. Однако, такое же значение получается и для пары Clemens, тоже находящейся в Лондоне со своим продавцом, которым опять же является Peel. Поскольку в запросе указано ключевое слово DISTINCT, в состав выходных данных включается только одна составная строка с этими значениями. Но какую пару из лежащих в основе таб лиц она представляет?
Даже если не использовать ключевое слово DISТINCT, ответ на вопрос не будет получен, поскольку в представлении были бы две абсолютно одинаковые строки, и нельзя узнать, какая строка представления из какой реальной строки базовой таблицы
224