Диго С.М. Базы данных проектирование и использование (1084447), страница 45
Текст из файла (страница 45)
Таблица описывается с помощью оператора CREATE TABLE. Таблица определяется путем задания содержащихся в ней столбцов. Все значения в столбце имеют один и тот же тип данных. При описании таблиц могут задаваться ограничения целостности данных.
В стандарте SQL-92 было определено семь типов данных. Однако большинство из них имеют подтипы с собственными именами, используемыми для задания типа данных при определении таблицы. В SQL-99 введено четыре новых типа данных, причем два из них -составные.
Конкретные реализации СУБД работают с различными типами данных. Причем наблюдаются случаи, когда СУБД не поддерживает некоторые из типов данных, определенных в стандарте SQL, и когда, напротив, содержит типы, которые в стандарт не включены. Используемые типы данных и форматы их представления особенно важны при обработке распределенных запросов в гетерогенной среде.
Другая важная характеристика языка - это поддержка неопределенных значений. Некоторые системы позволяют работать с неопределенными значениями, другие — нет. Эта характеристика является более значимой, чем может показаться на первый взгляд, поскольку поддержка неопределенных значений означает, кроме прочего, использование трехзначной логики при обработке значений вместо двузначной.
Структуру существующей таблицы можно изменять с помощью оператора ALTER TABLE.
Таблицы могут быть удалены с помощью оператора DROP TABLE.
Таблицы, используемые в каком-либо приложении, включаются в базу данных. База данных обычно содержит несколько таблиц, а также и цдексы и некоторые другие информационные объекты. В некоторых СУБД имеется оператор CREATE DATABASE. В стандарте SQL для аналогичных целей используется оператор CREATE SCHEMA.
Метаинформация в SQL-системах хранится также в виде реляционных таблиц (базы данных, основанные на таком принципе, называют самоописываемыми).
7.2.2. Ограничения целостности
Декларативное задание ограничений целостности. Ограничения целостности определяют допустимые значения базы данных пу-тем ограничения значений в базовых таблицах. В SQL большая часть ограничений целостности задается при описании таблицы. Возможность декларативного задания ограничений целостности является одним из существенных отличий стандарта SQL-89 и последующих от стандарта SQL-86.
При описании базы данных может быть задан ряд ограничений целостности.
-
Спецификация уникальности:
-
определение первичного ключа;
-
задание признака уникальности поля/совокупности полей.
-
Ограничение на столбец:
-
ограничение на неопределенное значение;
-
задание проверочных ограничений на строки таблицы (ограничения контроля).
-
-
Определение ограничений целостности связей (ссылки между
таблицами);
К этому типу ограничений примыкает возможность задания значений столбца по умолчанию при занесении строки в таблицу.
Ограничения целостности задаются с помощью определенных конструкций языка описания схемы при описании таблицы.
Определение ограничения уникальности (unique constraint definition) требует, чтобы никакие две строки в таблице не имели одинаковых значений в указанном столбце или совокупности столбцов.
Это ограничение позволяет определить вероятные ключи таблицы. Тот из вероятных ключей, который выбран в качестве первичного, описывается как PRIMARY KEY. Ограничение PRIMARY KEY может использоваться только один раз для каждой таблицы. Остальные вероятные ключи могут быть определены путем использования ограничения UNIQUE.
Спецификация NOT NULL требует, чтобы никакие значения в столбце не были неопределенными значениями.
Для определения ограничения ссылок (referential constraint definition) используются ограничения FOREIGN KEY и REFERENCES. После ключевых слов FOREIGN KEY в круглых скобках указывается список имен описываемой таблицы (ссылающейся таблицы, • порожденной таблицы). После ключевого слова REFERENCES указывается имя таблицы, которая содержит родительский ключ, и далее в круглых скобках - список столбцов, составляющих этот первичный ключ. В принципе ссылающаяся таблица может быть той же самой таблицей, что и целевая таблица.
Определение проверочного ограничения (check constraint definition) требует, чтобы указанное в нем условие (search condition) было истинным для каждой строки таблицы.
Момент проверки ограничения целостности зависит от конкретной реализации. Стандарт SQL-92 позволяет определить ограничения таким образом, чтобы они не проверялись до завершения текущей транзакции. Вводятся понятия неотложенное и отложенное ограничение целостности. По умолчанию ограничения определяются как неотложенные. Неотложенные ограничения проверяются при выполнении каждого оператора SQL (SQL statement). Если базовая таблица, ассоциированная с ограничением целостности, не удовлетворяет его условию, то оператор SQL не выполняется.
Триггеры. Триггер представляет собой специальную хранимую процедуру, которая не вызывается непосредственно ни из клиентского приложения, ни из другой хранимой процедуры, а неявно активизируется при выполнении той или иной связанной с ним операции (события).
Триггеры обычно ассоциируют с операциями обновления (UPDATE), вставки (INSERT) и удаления (DELETE) в таблице. Триггеры часто используются для задания различных проверок целостности данных при выполнении упомянутых выше операций.
Триггеры не определены в стандарте SQL, но поддерживаются практически во всех SQL-серверах и даже во многих настольных СУБД. Типы возможных триггеров и их синтаксис сильно различаются от системы к системе.
7.3. Запросы на выборку
Основным оператором языка SQL, позволяющим осуществлять отбор информации из базы данных, является оператор SELECT, который в простейшем виде может быть задан следующим образом:
SELECT <список колонок, включаемых в ответ>
FROM <список таблиц>
WHERE <условие>.
Предложения SELECT (отобрать) и FROM (из) должны присутствовать обязательно. Условие WHERE (где) может быть опущено. Тогда в ответ войдут все строки, имеющиеся в таблице (если быть точным, то надо иметь в виду, что такой оператор должен соответствовать реляционной операции «проекция», и если в результате проекции на выбранные столбцы будут появляться дублирующие строки, то они должны быть удалены из ответа; однако SQL позволяет управлять выводом в ответ повторяющихся строк, и можно добиться как вывода только уникальных строк, так и включения в ответ повторяющихся строк).
Оператор SELECT может включать в себя и другие предложения, позволяющие, в частности, осуществлять упорядоченность ответа, выполнять обобщающие функции. Полный синтаксис оператора SELECT будет рассмотрен позже.
Если в ответ должны войти все колонки, имеющиеся в исходной таблице, то вместо их перечисления в SELECT можно поставить знак «*».
Так, например, запрос «Выдать всю информацию из таблицы «Kadr» по сотрудникам, чей возраст (vozr) равен 40 годам» {см. рис.6.1) может быть представлен на SQL следующим образом:
SELECT * FROM kadr WHERE vozr=40;
Условие, задаваемое в предложении WHERE, может быть простым и сложным. Для формулирования сложного условия могут быть использованы логические операторы AND и OR. Так, например, запрос «Выдать всю информацию из таблицы «Kadr» по мужчинам, чей возраст равен 40 годам» (т.е. пол=«мужской » И «возраст=40 лет ») может быть представлен на SQL следующим образом:
SELECT * FROM kadr WHERE vozr = 40 AND pol = "м";
Оператор SELECT оперирует над множествами и результатом обработки в общем случае является множество строк. К этим множествам могут быть применены теоретико-множественные операции объединение (UNION), пересечение (INTERSECTION), разность (DIFFERENCE, MINUS, EXCEPT) и др. В разных реализациях языка SQL наборы теоретико-множественных операций различаются.
Язык SQL позволяет запрашивать вычисляемые значения. В этом случае в предложении SELECT указывается выражение для вычисления значения колонки. Например, в приведенном ниже предложении запрашивается вывод стоимости поставленных товаров путем ее вычисления на основе хранящихся в таблице «Postypl» данных о количестве (kolv) поставленных товаров и их цены {репа):
SELECT naimprod, datapost, kolv*cena
FROM postypl;
Запрос может быть простым, состоящим из одного оператора SELECT, и вложенным, когда один оператор SELECT включается в состав другого оператора. Этот включенный оператор называется подзапросом (subselect) или подчиненным запросом. Существуют два типа вложенных подзапросов: обычный и коррелированный. В обычном подзапросе внутренний запрос выполняется первым, и его результат используется для выполнения основного запроса. В коррелированном подзапросе внешний запрос выполняется первым, и его результат используется для выполнения внутреннего запроса. Внутренний запрос выполняется для каждой строки, возвращенной внешним запросом.
В запросе можно указать упорядоченность ответа по определенному признаку (полю, совокупности полей, выражению).
Возможна подгруппировка данных в целях получения подытогов или других обобщающих величин (среднее, минимум, максимум и др.). Набор агрегатных функций отличается в разных системах. В стандарт SQL-92 включены следующие агрегатные функции: Count - подсчет, Avg - среднее, Sum - сумма, Мах - максимум, Min - минимум.
В запросе допускается только один уровень группировки. Группировка может осуществляться как по одному полю, так и по совокупности полей.
При выполнении запроса может возникнуть необходимость соединения двух или более таблиц. Возможны разные способы задания условия соединения (вложенные запросы, задание условия соединения в предложении WHERE, операция JOIN в предложении FROM). Более подробно эти вопросы будут рассмотрены ниже.
В некоторых реализациях языка SQL отобранные оператором SELECT данные могут быть сохранены в виде таблицы базы данных.
7.4. Возможности корректировки хранимых данных
Хотя SQL первоначально создавался как язык запросов, в настоящее время он является комплексным языком запросов-обновлений. Кроме оператора SELECT, позволяющего проводить отбор данных, SQL включает в себя операторы корректировки БД: включение новой записи (INSERT), обновление отдельных полей (UPDATE), удаление записи или группы записей (DELETE).
Операторы языка манипулирования данными SQL могут использоваться как самостоятельно, так и совместно с операторами других языков манипулирования данными.
7.5. Создание представлений (VIEW)
Представление - это виртуальная таблица, данные для которой получаются из базовых таблиц или других представлений. Представление может быть получено из одной таблицы или нескольких; оно может включать в себя вычисляемые поля.
Представление можно рассматривать как хранимый запрос (оно и выражается с помощью запроса). Представление может использоваться в запросах наряду с реальными таблицами. Оно упрощает создание сложных запросов.
Синтаксис оператора CREATE VIEW различается в реализациях конкретных систем.
7.6. Создание и использование курсоров
Курсор похож на представление в том, что при его определении используется запрос. Когда курсор открыт, он содержит результат этого запроса. Но назначение представления и курсора различно. Курсоры используются только во встроенном SQL.
Курсор создается с помощью команды
DECLARE имя_курсора CURSOR
FOR подзапрос;
Курсоры используются для согласования теоретико-множественного языка SQL и включающих языков, которые являются языками позаписной обработки. Для выборки текущей записи активного множества используется оператор FETCH.
-
Управление транзакциями
Транзакция представляет собой группу последовательных SQL-операторов, которые переводят базу данных из одного целостного состояния в другое. В случае возникновения какого-либо сбоя (ошибки) результаты аннулируются и обеспечивается «откат» базы данных в исходное состояние.
Способ, каким осуществляется требование начать выполнение транзакции, зависит от конкретной реализации SQL. В стандарте ANSI средств для явной активизации начала работы транзакций не предусмотрено.
К операторам, позволяющим управлять транзакциями, относятся:
-
COMMIT - завершает выполнение транзакции и пытается зафиксировать все изменения, вносимые транзакцией;
-
ROLLBACK - используется для того, чтобы отменить все изменения, вносимые транзакцией.
В SQL-92 есть еще оператор SET TRANSACTION, который позволяет назначить транзакции имя и задать дополнительные свойства транзакции.
Конкретные СУБД иногда включают команды управления транзакциями, которые не предусмотрены в стандарте.
7.8. Стандартный SQL-92
7.8.1. Создание объектов
Виды объектов
В стандарте SQL-92 определяются следующие виды объектов:
-
Table - таблица;
-
View - представление;
-
Schema ~ схема;
-
Domain - домен;
-
Assertion - утверждение;
-
Character set - набор символов;
-
Collation - последовательность сортировки;
-
Translation - преобразование одного набора символов в другой.
Рассмотрим здесь вопросы создания таблиц и доменов. Создание