
- •Язык sql Выбор данных (оператор select)
- •Предложение group by (применение агрегатных функций)
- •Предложение having (условия обработки сформированных групп)
- •Порядок обработки предложений where, group by и having
- •Соединение
- •Вывод итоговых значений
- •Вложенные запросы (подзапросы)
- •Операторы манипулирования данными (dml) с подзапросами.
- •Понятие представления. Операции создания представлений.
- •Распределенные запросы
Понятие представления. Операции создания представлений.
Представления, или просмотры (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]