Мартин Грубер - Понимание SQL (991940), страница 35
Текст из файла (страница 35)
Кроме того, поле snum — это первичный ключ таблицы Продавцов и, следовательно, должен по определению быть уникальным.=============== SQL Execution Log ==============| SELECT a.sname, cname, amt * comm|| FROM Nameorders a, Salespeople b|| WHERE a.sname = 'Axelrod' AND b.snum = a.snum; || =============================================== ||onumamtsnumsnamecname|| ----------------- ------------- ||300118.691007 RifkinCisneros ||30061098.161007 RifkinCisneros |================================================Рисунок 20.4: Обьединение основной таблицы с представлениемЕсли бы там, например, было два Axelrodf, вариант с именем будет объединятьвместе их данные.
Более предпочтительный вариант — использовать поле snum, чтобы хранить его отдельно.ПРЕДСТАВЛЕНИЯ И ПОДЗАПРОСЫПредставления могут также использовать и подзапросы, включая соотнесенныеподзапросы. Предположим, ваша компания предусматривает премию для тех продавцов, которые имеют заказчика с самым высоким порядком для любой указанной даты.Вы можете проследить эту информацию с помощью представления:CREATE VIEW ElitesalesforceAS SELECT b.odate, a.snum, a.sname,FROM Salespeople a, Orders bWHERE a.snum = b.snum AND b.amt = (SELECT MAX (amt)FROM Orders cWHERE c.odate = b.odate);Если, с другой стороны, премия будет назначаться только продавцу, которыйимел самый высокий порядок за последние десять лет, вам необходимо будет проследить их в другом представлении, основанном на первом:CREATE VIEW BonusAS SELECT DISTINCT snum, snameFROM Elitesalesforce aWHERE 10 <= (SELECT COUNT (*)FROM Elitesalestorce bWHERE a.snum = b.snum);Извлечение из этой таблицы продавца, который будет получать премию — выпоняется простым запросом:SELECT *FROM Bonus;Теперь мы видим истинную мощность SQL.
Извлечение той же полученной информации программами RPG или COBOL будет более длительной процедурой. ВSQL, это — только вопрос из двух комплексных команд, сохраненных, как представление совместно с простым запросом.При самостоятельном запросе — мы должны заботится об этом каждый день,потому что информация которую извлекает запрос, непрерывно меняется чтобы отражать текущее состояние базы данных.ЧТО НЕ МОГУТ ДЕЛАТЬ ПРЕДСТАВЛЕНИЯИмеются большое количество типов представлений (включая многие из нашихпримеров в этой главе) которые являются доступными только для чтения. Это означает, что их можно запрашивать, но они не могут подвергаться действиям команд модификации. (Мы будем рассматривать эту тему в Главе 21.)Имеются также некоторые виды запросов, которые не допустимы в определениях представлений.
Одиночное представление должно основываться на одиночном запросе; ОБЪЕДИНЕНИЕ (UNION) и ОБЪЕДИНЕНИЕ ВСЕГО (UNION ALL) неразрешаются. УПОРЯДОЧЕНИЕ ПО (ORDER BY) никогда не используется в определении представлений. Вывод запроса формирует содержание представления, которое напоминает базовую таблицу и является — по определению — неупорядоченным.УДАЛЕНИЕ ПРЕДСТАВЛЕНИЙСинтаксис удаления представления из базы данных подобен синтаксису удаления базовых таблиц:DROP VIEW <view name>В этом нет необходимости, однако, сначала надо удалить все содержание, какэто делается с базовой таблицей, потому что содержание представления не являетсясозданым и сохраняется в течении определеной команды.
Базовая таблица, из которой представление выводится, не эффективна, когда представление удалено.Помните, вы должны являться владельцем представления, чтобы иметь возможность удалить его.РЕЗЮМЕТеперь, когда вы можете использовать представления, ваша способность отслеживать и обрабатывать содержание вашей базы данных, значительно расширилась.
Любые вещи которые вы можете создать с запросом, вы всегда сможетеопределить как представление. Запросы этих представлений, фактически, запрос запроса.Использование представлений и для удобства, и для защиты также удобно, как имногие возможности представлений для форматирования и получения значений изпостоянно меняющегося содержания вашей базы данных. Имеется один главный вывод относительно представлений — это способность к модификации, которую мы выбрали в отличии от Главы 21. Как показано, вы можете модифицироватьпредставления также как и базовую таблицу, с помощью изменений, применяемых ктаблице, из которой получается представление, но это не всегда возможно.РАБОТА С SQL1. Создайте представление которое бы показывало всех заказчиков которые имеютсамые высокие оценки.2.
Создайте представление которое бы показывало номер продавца в каждом городе.3. Создайте представление которое бы показывало усредненый и общий порядки длякаждого продавца после его имени. Предполагается, что все имена — уникальны.4. Создайте представление которое бы показывало каждого продавца с многочислеными заказчиками.(См. Приложение A для ответов.)21ИЗМЕНЕНИЕ ЗНАЧЕНИЙС ПОМОЩЬЮПРЕДСТАВЛЕНИЙЭТА ГЛАВА РАССКАЗЫВАЕТ О КОМАНДАХ МОДИФИКАЦИИ ЯЗЫКА DML —ВСТАВИТЬ (INSERT), ИЗМЕНИТЬ (UPDATE), и УДАЛИТЬ (DELETE) — когда они применяются для представлений. Как упомянуто в предыдущей главе, использование команд модификации в представлениях — это косвенный способ использования их вссылочных таблицах с помощью запросов представлений.
Однако, не все представления могут модифицироваться.В этой главе, мы будем обсуждать правила определяющие, является ли представление модифицируемым. Кроме того, вы обучитесь использованию предложенияWITH CHECK OPTION, которое управляет указанными значениями, которые можновводить в таблицу с помощью представления.Как упомянуто в Главе 18, это, в некоторых случаях, может быть желательнымвариантом непосредственного ограничения таблицы.МОДИФИЦИРОВАНИЕ ПРЕДСТАВЛЕНИЯОдин из наиболее трудных и неоднозначных аспектов представлений — непосредственное их использование с командами модификации DML. Как упомянуто впредыдущей главе, эти команды фактически воздействуют на значения в базовойтаблице представления.Это является некоторым противоречием.
Представление состоит из результатовзапроса, и когда вы модифицируете представление, вы модифицируете набор результатов запроса. Но модификация не должна воздействовать на запрос; она должнавоздействовать на значения в таблице, к которой был сделан запрос, и таким образомизменять вывод запроса. Это не простой вопрос. Следующий оператор будет создавать представление, показанное на Рисунке 21.1:CREATE VIEW Citymatch (custcity, salescity)AS SELECT DISTINCT a.city, b.cityFROM Customers a, Salespeople bWHERE a.snum = b.snum;Это представление показывает все совпадения заказчиков с их продавцами так,что имеется по крайней мере один заказчик в городе_заказчика, обслуживаемыйпродавцом в городе_продавца.Например, одна строка этой таблицы — London London — показывает, что имеется по крайней мере один заказчик в Лондоне, обслуживаемый продавцом в Лондоне.
Эта строка может быть произведена при совпадении Hoffmanа с его продавцомPeel, причем если оба они из Лондона.=============== SQL Execution Log ==============| SELECT *|| FROM Citymatch;|| =============================================== ||custcitysalescity|| ----------------|| BerlinSan Jose|| LondonLondon|| RomeLondon|| RomeNew York|| San JoseBarselona|| San JoseSan Jose|=================================================Рисунок 21.1: Представление совпадения по городамОднако, то же самое значение будет произведено при совпадении Clemens изЛондона, с его продавцом, который также оказался с именем — Peel. Пока отличающиеся комбинации городов выбирались конкретно, только одна строка из этих значений была произведена.Даже если вы не получите выбора, используя отличия, вы все еще будете в томже самом положении, потому что вы будете тогда иметь две строки в представлении сидентичными значениями, то-есть с обоими столбцами равными "Lоndon London".
Этидве строки представления будут отличаться друг от друга, так что вы пока не сможетесообщить, какая строка представления исходила из каких значений базовых таблиц(имейте в виду, что запросы, не использующие предложение ORDER BY, производятвывод в произвольном порядке. Это относится также и к запросам, используемымвнутри представлений, которые не могут использовать ORDER BY. Таким образом,порядок из двух строк не может быть использован для их отличий. Это означает, чтомы будем снова обращаться к выводу строк, которые не могут быть точно связаны суказаными строками запрашиваемой таблицы.
Что если вы пробуете удалить строку”London London” из представления? Означало бы это удаление Hoffmanа из таблицыЗаказчиков, удаление Clemens из той же таблицы, или удаление их обоих? Должен лиSQL также удалить Peel из таблицы Продавцов? На эти вопросы невозможно ответитьточно, поэтому удаления не разрешены в представлениях такого типа. ПредставлениеCitymatch — это пример представления только_чтение, оно может быть только запрошено, но не изменено.ОПРЕДЕЛЕНИЕ МОДИФИЦИРУЕМОСТИ ПРЕДСТАВЛЕНИЯЕсли команды модификации могут выполняться в представлении, представление как сообщалось будет модифицируемым; в противном случае оно предназначенотолько для чтения при запросе.
Непротивореча этой терминологии, мы будем использовать выражение "модифицируемое представление" (updating a view), чтоы означаетвозможность выполнения в представление любой из трех команд модификации DML(Вставить, Изменить и Удалить), которые могут изменять значения.Как вы определите, является ли представление модифицируемым? В теориибазы данных, это — пока обсуждаемая тема. Основной ее принцип такой: модифицирумое представление — это представление, в котором команда модификации можетвыполниться, чтобы изменить одну и только одну строку основной таблицы в каждыймомент времени, не воздействуя на любые другие строки любой таблицы.