Диго С.М. Базы данных проектирование и использование (1084447), страница 49
Текст из файла (страница 49)
К представлениям могут быть обращены не только поисковые, но и корректирующие запросы. В последнем случае операции, применяемые к представлению, должны быть отражены в базовых таблицах. Поскольку представления в принципе могут быть созданы с использованием разнообразных операторов SELECT (например, обеспечивающих соединение нескольких таблиц или использующих групповые операции или иные вычисляемые атрибуты), то это может вызвать определенные проблемы при выполнении обновления. Таким образом, не все представления являются обновляемыми (изменяемыми).
Чтобы не была нарушена целостность БД, должны соблюдаться следующие ограничения:
-
нельзя корректировать данные представлений, полученных на основе нескольких базовых таблиц (в некоторых СУБД это ограничение менее жесткое);
-
при определении представления не должно использоваться со
единение таблицы «сама с собой»; -
нельзя манипулировать данными представлений, полученных на основе оператора группирования (GROUP BY);
-
нельзя корректировать вычисляемые поля;
-
представление должно содержать один и только один запрос, т.е. не допускается использование UNION, EXCEPT, INTERSECT;
-
включающий запрос представления не может содержать предложение DISTINCT;
-
ни на один столбец нельзя ссылаться в SELECT более одного раза.
При описании представления в качестве исходных для него могут использоваться не только базовые таблицы, но и другие представления. Представление, базирующееся на другом представлении, будет обновляемым, если исходное является обновляемым, и для вновь создаваемого представления будут соблюдены указанные выше условия.
Все эти ограничения вызваны тем, что в противном случае трудно (а иногда и невозможно) обеспечить целостность данных в БД, поскольку неясно, как отобразить операцию корректировки в соответствующие базовые таблицы.
В некоторых программных продуктах не обеспечивается контроль всех перечисленных выше ограничений, поэтому при использовании представлений следует соблюдать осторожность.
Специфицировать WITH CHECK OPTION в операторе CREATE VIEW можно только для обновляемых представлений.
В SQL-99 существенно расширен диапазон представлений, над которыми напрямую могут выполняться операции обновления.
Создание представлений с использованием ERWin
Создавать представления можно и при проектировании БД с использованием CASE-систем.
В ERWin создавать представления можно на физическом уровне моделирования. Для создания представления следует воспользоваться кнопкой панели инструментов. Представление изображается в модели в виде четырехугольника с закругленными углами, ограниченного пунктирной линией. После этого нужно установить связь представления с таблицами-источниками, воспользовавшись для этого кнопкой. Для задания связи необходимо сначала щелкнуть по исходной таблице, а потом - по значку представления. При этом все поля исходной таблицы переносятся в создаваемое представление.
Для того чтобы исключить некоторые из полей или провести другие изменения в представлении, следует воспользоваться редактором представлений (View Editor).
Поскольку в целевой СУБД представление реализуется в виде оператора SQL, а, как известно, диалекты SQL различаются в разных СУБД, то и окна редактора представлений несколько различаются в зависимости от выбранной целевой СУБД. Для сравнения на рис. 7.1 представлен вид окна для целевой СУБД Access, а на рис. 7.2 - для целевой СУБД Oracle.
Для того чтобы отобрать поля, которые должны входить в представление, следует воспользоваться вкладкой Select в окне редактора представлений (см. рис. 7.2).
Таблицы, на основе которых формируется представление, указываются на вкладке From (рис. 7.3). Если на этой вкладке добавить таблицы в окно From, то на схеме появится связь представления с соответствующей таблицей.
На вкладке Where (рис. 7.4) можно задать условие отбора и другие предложения оператора SELECT.
Возможность создать представление в ERWin имеется для всех целевых СУБД, даже для тех (например, Access), в которых оператор CREATE VIEW в явном виде не поддерживается.
На вкладке SQL (рис. 7.5) можно увидеть текст сгенерированных предложений SQL.
Таким образом, как мы видим, создать представление при использовании ERWin несколько легче, чем при написании оператора CREATE VIEW непосредственно на языке SQL.
7.8.4. Курсоры
Курсоры обычно используются в рамках SQL, встроенного в программы, написанные на языке процедурного типа. Использование курсоров вызвано необходимостью стыковать позаписные включающие языки и теоретико-множественный язык SQL.
Курсор определяется посредством оператора объявления курсора (DECLARE CURSOR). Этот оператор определяет имя курсора, а так же содержит в своем составе запрос, выходные данные которого сохраняются для последующей обработки включающей программой:
DECLARE <имя_курсора> [INSENSITIVE] [SCROLL] CURSOR
FOR <подзапрос> [<предложение для обновления>]
Курсор находится либо в открытом состоянии, либо в закрытом. Начальное состояние курсора - закрытое. Для открытия курсора используется оператор OPEN CURSOR <имя курсора>. Запрос, описанный при определении курсора, выполняется именно при открытии курсора. При первом открытии курсор устанавливается перед первой строкой. Позиция курсора в открытом состоянии может быть перед определенной строкой, на определенной строке или после последней строки. Если курсор установлен на строку, то эта строка является текущей строкой курсора.
Для построчного извлечения данных из курсора используется оператор FETCH. Этот оператор продвигает позицию открытого курсора на следующую строку в порядке этого курсора, извлекает значения полей этой строки в переменные и имеет следующий синтаксис:
FETCH [[orientation]FROM] имя курсора
INTO целевая спецификация.,..;
orientation::=
NEXT | PRIOR | FIRST | LAST | {ABSOLUTE | RELATIVE
спецификация значения}
Значения NEXT, PRIOR, FIRST, LAST понятны без дополнительного пояснения. Значение ABSOLUTE N вызывает перемещение на N-ю строку, а значение RELATIVE N - перемещение на N строк вперед, если N - положительное число, и на N строк назад, если N -отрицательное число.
Если задано предложение INSENSITIVE (нечувствительный), то, пока курсор открыт, все изменения над данными курсора будут игнорироваться.
Строки открытого курсора имеют определенный порядок. Для того чтобы установить нужный порядок, можно использовать в операторе SELECT предложение ORDER BY. В противном случае порядок устанавливается реализацией.
Если задано предложение SCROLL, то не обязательно извлекать строки в том порядке, который задан при открытии.
Курсоры могут быть двух типов: обновляемые и только для чтения. Чтобы курсор был обновляемым, он должен базироваться на одной и только одной таблице, не содержать предложения ORDER BY, не объявляться как INSENSITIVE или SCROLL.
Курсор возвращается в закрытое состояние посредством использования оператора закрытия курсора CLOSE <имя курсора.>
7.9. MS Jet Access SQL
Поскольку, несмотря на наличие стандартов, реализация языка в каждой СУБД имеет специфические особенности, а работать приходится в конкретной среде, то примеры на использование SQL необходимо рассматривать в реальных системах. В связи с широким использованием в настоящее время СУБД Access рассмотрим реализацию SQL на примере этой системы.
Microsoft Access SQL в основном отвечает стандарту ANSI-89 (уровень 1). Однако некоторые средства ANSI SQL не применяются в Microsoft Access SQL. И наоборот, Microsoft Access SQL использует зарезервированные слова и средства, не поддерживаемые ANSI SQL.
Кроме того, в Access 2000 имеется режим ANSI SQL-92. Этот режим учитывает расширенный синтаксис SQL и обеспечивает большую совместимость с SQL-92 и Microsoft® SQL Server™. Этот режим доступен только в случае использования программы Microsoft OLE DB Provider для Jet. Новые средства относятся преимущественно к языку определения данных (DDL).
В качестве построителя запросов на SQL можно использовать табличный язык запросов QBE. Но не все типы запросов SQL могут быть реализованы на QBE. В Access такие типы запросов, как запросы к серверу, управляющие запросы (т.е. запросы, которые корректируют содержимое таблиц) и запросы на объединение, не могут быть определены в бланке запроса. Для создания таких запросов требуется ввести оператор SQL непосредственно в окно запроса в режиме SQL.
7.9.1. Оператор SELECT
Общая характеристика оператора
Оператором SQL, осуществляющим отбор информации из базы данных, является SELECT или его разновидность - SELECT...INTO.
Синтаксис оператора SELECT в Access имеет следующий вид:
SELECT [предикат] {* | таблица.* | [таблица.]поле1
[AS псевдоним1] [, [таблица.]поле2 [AS псевдоним2] [,...]]}
FROM выражение [,...] [IN внешняя_база_данных]
[WHERE... ]
[GROUP BY...]
[HAVING...]
[ORDER BY...]
[WITH OWNERACCESS OPTION]
Как видим, синтаксис оператора SELECT в Access несколько отличается от стандарта. Конструкции [IN внешняя_база_данных] и [WITH OWNERACCESS OPTION] отсутствуют в стандарте SQL.
Ниже перечислены аргументы оператора SELECT.
Аргумент | Описание |
Предикат | Один из следующих предикатов отбора: ALL,DISTINCT, DISTINCTROW или ТОР. Предикаты используются для ограничения числа возвращаемых записей. Если они отсутствуют, по умолчанию используется предикат ALL |
* | Указывает, что выбраны все поля заданной таблицы (таблиц) |
Таблица | Имя таблицы, из которой должны быть отобраны записи |
Поле1, поле2 | Имена полей, из которых должны быть отобраны данные. Порядок следования полей в запросе определяет, в каком порядке соответствующие значения будут выводиться в ответ |
Псевдоним1 Псевдоним2 | Имена, которые станут заголовками столбцов вместо исходных названий столбцов в таблице |
Выражение | Имена одной или нескольких таблиц, которые содержат отбираемые данные |
Внешняя_база_данных | Имя базы данных, которая содержит таблицы, указанные с помощью предыдущего аргумента, если они находятся не в текущей базе данных |
Имена полей, которые содержат пробелы или знаки препинания, необходимо заключать в квадратные скобки ([ ]).
Описание WITH OWNERACCESS OPTION используется при работе в сети в составе защищенной рабочей группы и здесь рассматриваться не будет.
Предложение SELECT
Предложение SELECT оператора SELECT служит для указания полей, выводимых в результатную таблицу. Это могут быть поля исходных таблиц, вычисляемые поля или поля, содержащие константу. Имена полей, выводимых в ответ, разделяются между собой запятой.
Для отбора всех полей таблицы можно использовать звездочку (*). Следующий оператор отбирает все поля из таблицы «Сотрудник»:
SELECT * FROM Сотрудник;
Если в запросе используется несколько таблиц, то перед знаком (*) следует поместить имя таблицы, из которой будут выводиться все поля, отделенные от этого знака точкой:
SELECT ФИО, Семья.*
FROM Сотрудник INNER JOIN Семья
ON Сотрудник.Код_сотрудника = Семья.Код_сотрудника;
В данном примере из таблицы «Семья» в ответ выводятся все поля, а из таблицы «Сотрудник» - только поле ФИО.
Поясним значение предикатов, используемых в качестве аргументов оператора SELECT.