Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык SQL выбор данных Ред 2010 12.01Зам.doc
Скачиваний:
11
Добавлен:
26.08.2019
Размер:
913.92 Кб
Скачать

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

Представления, или просмотры (VIEW), представляют собой временные, производные (иначе - виртуальные) таблицы и являются объектами базы данных, информация в которых не хранится постоянно, как в базовых таблицах, а формируется динамически при обращении к ним. Обычные таблицы относятся к базовым, т.е. содержащим данные и постоянно находящимся на устройстве хранения информации. Представление не может существовать само по себе, а определяется только в терминах одной или нескольких таблиц.

У двух рассмотренных ранее типов табличных выражений – производных таблиц и ОТВ – ограниченная область действия, единственная инструкция языка. Как только внешний запрос к табличным выражениям завершается, они исчезают и не могут использоваться многократно.

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

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

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

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

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

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

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

Создания и изменения представлений в стандарте языка и реализации в MS SQL Server совпадают и представлены следующей командой:

<определение_просмотра> ::=

{ CREATE| ALTER} VIEW имя_просмотра [(имя_столбца [,...n])]

[WITH <view_attribute> [ ,...n ]]

AS SELECT_оператор

[WITH CHECK OPTION]

<view_attribute> ::= { [ ENCRYPTION ]    [ SCHEMABINDING ]

    [ VIEW_METADATA ]     }

Рассмотрим назначение основных параметров.

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

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

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

Явное указание имени столбца требуется для вычисляемых столбцов или при объединении нескольких таблиц, имеющих столбцы с одинаковыми именами. Имена столбцов перечисляются через запятую, в соответствии с порядком их следования в представлении.

ENCRYPTION - предписывает серверу шифровать SQL-код запроса, что гарантирует невозможность его несанкционированного просмотра и использования.

Если при определении представления необходимо скрыть имена исходных таблиц и столбцов, а также алгоритм объединения данных, необходимо применить этот аргумент. Использование предложения WITH ENCRYPTION предотвращает публикацию представления в рамках репликации SQL Server.

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

Параметр WITH CHECK OPTION предписывает серверу исполнять проверку изменений, производимых через представление, на соответствие критериям, определенным в операторе SELECT. Это означает, что не допускается выполнение изменений, которые приведут к исчезновению строки из представления. Такое случается, если для представления установлен горизонтальный фильтр (см. далее) и изменение данных приводит к несоответствию строки установленным фильтрам.

Использование аргумента WITH CHECK OPTION гарантирует, что сделанные изменения будут отображены в представлении. Если пользователь пытается выполнить изменения, приводящие к исключению строки из представления, при заданном аргументе WITH CHECK OPTION сервер выдаст сообщение об ошибке и все изменения будут отклонены.

Пример. Показать в представлении клиентов из Москвы.

Создание представления:

CREATE VIEW view1 AS

SELECT КодКлиента, Фамилия, ГородКлиента

FROM Клиент

WHERE ГородКлиента='Москва'

Рассмотрим команду:

INSERT INTO view1 VALUES (12, 'Петров', 'Самара')

Это допустимая команда в представлении, и строка будет добавлена с помощью представления view1 в таблицу Клиент.

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

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

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

Если в операторе CREATE VIEW будет указана фраза WITH CHECK OPTION, то СУБД станет осуществлять контроль за тем, чтобы в исходные таблицы базы данных не была введена ни одна из строк, не удовлетворяющих предложению WHERE в определяющем запросе. Этот механизм гарантирует целостность данных в представлении.

Для представления

CREATE VIEW view1 AS

SELECT КодКлиента, Фамилия, ГородКлиента

FROM Клиент

WHERE ГородКлиента='Москва'

WITH CHECK OPTION

вышеупомянутая вставка значений (INSERT INTO view1 VALUES (12, 'Петров', 'Самара')) будет отклонена системой.

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

Выборка данных из представления view1:

SELECT * FROM view1

Представления и элемент ORDER BY.

Напомним, что присутствие ORDER BY запрещено в запросе, определяющем табличное выражение (стандарт ANSI SQL не разрешает применять элемент order BY в запросах, определяющих табличные выражения).

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

Пример:

CREATE VIEW Sales.USACusts

AS

SELECT

custid, companyname, contactname, contacttitle, address,

city, region, postalcode, country, phone, fax

FROM Sales.Customers

WHERE country = N'USA';

GO

SELECT custid, region,companyname

FROM Sales.USACusts;

GO

Результат:

При изменении представления:

CREATE VIEW Sales.USACusts

AS

SELECT

custid, companyname, contactname, contacttitle, address,

city, region, postalcode, country, phone, fax

FROM Sales.Customers

WHERE country = N'USA'

Order BY region

выдается ошибка: Msg 1033, Level 15, State 1, Procedure USACusts, Line 9

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

Чтобы избежать ошибки, следует задавать Order BY во внешнем запросе к представлению:

SELECT custid, region,companyname

FROM Sales.USACusts--представление

Order BY region

Результат:

Изменение просмотра.

<изменение_просмотра> ::= ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ]

[ WITH <view_attribute> [ ,...n ] ]

AS select_statement

[ WITH CHECK OPTION ] [ ; ]

Пример: создается представление EmployeeHireDate, содержащее фамилии и имена всех сотрудников, а также даты их приема на работу.

USE AdventureWorks ;

GO

CREATE VIEW HumanResources.EmployeeHireDate

AS

SELECT c.FirstName, c.LastName, e.HireDate

FROM HumanResources.Employee AS e JOIN Person.Contact AS c

ON e.ContactID = c.ContactID ;

GO

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

ALTER VIEW HumanResources.EmployeeHireDate

AS

SELECT c.FirstName, c.LastName, e.HireDate

FROM HumanResources.Employee AS e JOIN Person.Contact AS c

ON e.ContactID = c.ContactID

WHERE HireDate < CONVERT(DATETIME,'19980101',101) ;

Если не использовать инструкцию ALTER VIEW, а удалить представление и создать его заново, нужно будет повторно выполнить инструкцию GRANT и любые другие инструкции, работающие с разрешениями данного представления.

Не все представления в SQL могут быть модифицированы. Модифицируемое представление определяется следующими критериями:

  • основывается только на одной базовой таблице;

  • содержит первичный ключ этой таблицы;

  • не содержит DISTINCT в своем определении;

  • не использует GROUP BY или HAVING в своем определении;

  • не применяет в своем определении подзапросы;

  • не использует константы или выражения значений среди выбранных полей вывода;

  • в просмотр должен быть включен каждый столбец таблицы, имеющий атрибут NOT NULL;

  • оператор SELECT просмотра не использует агрегирующие (итоговые) функции, соединения таблиц, хранимые процедуры и функции, определенные пользователем;

  • основывается на одиночном запросе, поэтому объединение UNION не разрешено.

Если просмотр удовлетворяет этим условиям, к нему могут применяться операторы INSERT, UPDATE, DELETE.

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

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

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

Немодифицируемое представление с данными из разных таблиц

CREATE VIEW view2 AS

SELECT Клиент.Фамилия, Клиент.Фирма,

Сделка.Количество

FROM Клиент INNER JOIN Сделка

ON Клиент.КодКлиента=Сделка.КодКлиента

Немодифицируемое представление с группировкой и итоговыми функциями.

CREATE VIEW view3(Тип, Общ_остаток) AS

SELECT Тип, Sum(Остаток)

FROM Товар

GROUP BY Тип

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

Модифицируемое представление с вычислениями

CREATE VIEW view4 (Код, Название,

Тип, Цена, Налог) AS

SELECT КодТовара, Название,

Тип, Цена, Цена*0.05 FROM Товар

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

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

Другая классификация представлений.

Горизонтальное представление. Этот вид представления широко применяется для уменьшения объема реальных таблиц в обработке и ограничения доступа пользователей к закрытой для них информации.

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

Пример

Таблица "Сотрудник" (EMPLOYEE) с полями "Табельный номер" (T_NUM), "ФИО" (NAME), "должность"(POSITION), "оклад"(SALARY), "надбавка"(PREMIUM), "отдел" (DEPARTMENT).

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

CREATE VIEW SAL_DEPT

AS

SELECT *

FROM EMPLOYEE

WHERE DEPARTMENT= "Отдел продаж"

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

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

CREATE VIEW TABEL

AS

SELECT T_NUM, NAME, POSITION, DEPARTMENT

FROM EMPLOYEE

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

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

CREATE VIEW RATE

DEPARTMENT, COUNT(*), SUM(SALARY), SUM(PREMIUM), MAX(SALARY), MIN(SALARY),

AVERAGE (SALARY), MAX(PREMIUM), MIN(PREMIUM), AVERAGE (PREMIUM)

AS

SELECT DEPARTMENT, COUNT(*), SUM(SALARY), SUM(PREMIUM), MAX(SALARY),

MIN(SALARY), AVERAGE (SALARY), MAX(PREMIUM), MIN(PREMIUM),

AVERAGE (PREMIUM)

FROM EMPLOYEE

GROUP BY DEPARTMENT

Объединенные представления. Часто представления базируются на многотабличных запросах.

Пример: (база данных "Библиотека" использовалась ранее) представление, которое содержит список читателей-должников с указанием книг, которые у них на руках, и указанных в базе сроков сдачи этих книг.

CREATE VIEW DEBTORS

ISBN,TITLE, NUM_READER, NAME, ADRES, HOME_PHON, WORK_PHON, DATA_OUT

AS

SELECT ISBN, TITLE, NUM_READER, NAME, ADRES, HOME_PHON, WORK_PHON, DATA_OUT

FROM BOOKS, EXEMPLAR, READERS

WHERE BOOKS.ISBN = EXEMPLAR.ISBN AND

EXEMPLAR.NUM_READER = READERS.NUM_READER AND

EXEMPLAR.PRESENT = FALSE AND

EXEMPLAR.DATA_OUT < GetDate()

Представление удаляется командой:

DROP VIEW имя_просмотра [,...n]