Сейчас уже принят третий стандарт SQL3. SQL содержит следующие разделы Операторы определения данных DDL (Data definition language). ALTER TABLE Изменить таблицу.

Модели клиент-сервер
Основной принцип технологии “клиент-сервер” заключается в разделении функций стандартного интерактивного приложения на 4 группы, имеющие различную природу:
- функции ввода и отображения данных (компонент представления)
- прикладные функции
- функции хранения и управления информационными ресурсами
- служебные функции, играющие роль связок между функциями первых трех групп


Модель файлового сервера FS
( Запросы к файловой системе)

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

Модель удаленного доступа к данным
Remote Data Access - RDA
запросы на SQL

данные
клиент сервер

В данной модели компонент доступа к информационным ресурсам выполняется с помощью SQL сервера. Коды компонента представления и прикладного компонента совмещены и выполняются в клиентстком процессе.
- перенос компонента представления и прикладного компонента на клиентский компьютер существенно разгрузил Сервер БД, сводя к минимуму общее число процессов в операционной системе.
- сервер БД освобождается от несвойственных ему функций; процессор- или процессоры сервера целиком загружаются операциями обработки данных, запросов и транзакций. (Это становится возможным отказом от терминалов , не располагающих ресурсами и заменой их компьютерами, выполняющими роль клиентских станций , которые обладают собственными локальными вычислительными ресурсами)
резко уменьшается загрузка сети, так как по ней от клиентов к серверу передаются не запросы на ввод-вывод в файловой терминологии, а запросы на SQL, и их объем существенно меньше. В ответ на запросы, клиент получает только данные, релевантные запросу, а не блоки файлов как в FS-модели.

Основное достоинство RDA модели: - унификация интерфейса “клиент-сервер”, стандартом при общении приложения-клиента и сервера становится язык SQL .
Недостатки:
- все таки запросы на языке SQL при интенсивной работе клиентских приложений могут существенно загрузить сеть;
в этой модели из за пассивной роли сервера БД не возможно удовлетворительное администрирование приложений - т.к. в одной программе - приложении совмещены различные по природе функции: представления и прикладные

Модель сервера баз данных (Data Base Server - DBS)

вызов SP

данные



Необходимо, чтобы БД в каждый момент отражала текущее состояние предметной области, которое определяется не только собственно данными, но и связями между объектами данных. Т.е. данные, которые хранятся в БД в каждый момент времени должны быть непротиворечивыми.
БД должна отражать некоторые правила предметной области, законы, по которым она функционирует (business rull). Завод может нормально работать только в том случае, если на складе имеется некоторый достаточный запас деталей определенной номенклатуры.
Необходим постоянный контроль за состоянием БД, отслеживание всех изменений и адекватная реакция на них: например при достижении некоторым измеряемым параметром критического значения, должно произойти отключение определенной аппаратуры.
Необходимо, чтобы возникновение некоторой ситуации в БД четко и оперативно влияло на ход выполнения прикладной задачи.
Одной из важнейших проблем СУБД является контроль типов данных. В настоящий момент СУБД контролирует синтаксически только стандартно-допустимые типы данных, т.е. такие, которые определены в DDL data definition language - языке описания данных, который является частью SQL . Однако в реальных предметных областях у нас действуют данные, которые несут в себе еще и семантическую составляющую например это координаты объектов или единицы различных метрик( рабочая неделя в отличие от реальной имеет сразу после пятницы Понедельник).
Данную модель поддерживают большинство современных СУБД
(Informix, Ingres,Sybase,Oracle, MS SQL Server). Основу данной модели составляет механизм хранимых процедур -средство программирования SQL сервера.
Процедуры хранятся в словаре БД, они разделяются между несколькими клиентами, т.е. могут быть использованы несколькими клиентскими приложениями









Application server (AS) Сервер приложений





SQL

SQL (Structured Query Language )- Структурированный Язык Запросов. - стандартный язык запросов по работе с реляционными БД.

Первый международный стандарт языка SQL был принят в 1989 г. (далее мы будем называть его SQL/89), и подавляющее большинство доступных на рынке СУБД поддерживают именно этот стандарт.
В конце 1995 г. был принят новый международный стандарт языка SQL (SQL/92). И он не лишен недостатков, но в то же время является существенно более точным и полным, чем SQL/89. Сейчас уже принят третий стандарт SQL3.
SQL содержит следующие разделы
Операторы определения данных DDL (Data definition language).
ALTER TABLE
Изменить таблицу


CREATE TABLE
Создать таблицу


CREATE DOMAIN
Создать домен


ALTER DOMAIN
Изменить домен


DROP TABLE
Удалить таблицу


DROP DOMAIN
Удалить домен


CREATE VIEW
Создать представление


ALTER VIEW
Изменить представление


DROP VIEW
Удалить представление


Create Index
Создать индекс


Drop Index
Удалить индекс



Операторы манипулирования данными Data Manipulation Language (DMP)
DELETE
удалить одну или несколько строк


INSERT
Вставить одну или несколько строк


UPDATE
Обновить одну или несколько строк



Язык запросов Data Query Language (DQL)
Оператор SELECT
Средства управления транзакциями
COMMIT
Завершить транзакцию


ROLLBACK
Откатить транзхакцию


SAVEPOINT
Сохранить промежуточную точку выполнения транзакции



Средства администрирования данных
ALTER DATABASE
Изменить БД


ALTER DBAREA
Изменить область хранения БД


ALTER PASSWORD
Изменить пароль


CHEK DATABASE
Проверить БД


CREATE DATABASE
Создать БД


CREATE DBAREA
Создать область хранения


DEINSTALL DATABASE



DROP DATABASE
Удалить БД


DROP DBAREA



GRANT
Предоставить права доступа


INSTALL DATABASE
Инсталировать БД


REVOKE
Лишить прав доступа



2.2 Типы данных

В языке SQL/89 поддерживаются следующие типы данных: CHARACTER, NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION. Эти типы данных классифицируются на типы строк символов, точных чисел и приблизительных чисел.
В стандарте SQL92 добавлены следующие типы данных:
VARCHAR(n) строки символов переменной длины
NCHAR(N) – строки локализованных символов постоянной длины
NCHAR VARYING(n) - строки локализованных символов переменной длины
BIT(n) строка битов постоянной длины
BIT VARYING(n) строка битов переменной длины
DATE календарная дата
TIMESTAMP(точность) дата и время
INTERVAL временной интервал

Встроенный SQL
Операторы работы с курсорами Create Cursor, Open Cursor, Feth
Операторы статического и динамического встроенного SQL
_______________________________________________________________
Наиболее востребованным для конечных пользователей является оператор поиска Select и операторы манипулирования данными Insert,Update,Delete.

Упрощенный синтаксис оператора выборки SELECT

SELECT [ ALL | DISTINCT ] < список столбцов результата>
FROM < список исходных таблиц>
[WHERE <предикат - условие выборки или соединения >]
[GROUP BY - < список полей группировки >]
[HAVING <предикат условие на группы>]
[ ORDER BY < список полей упорядочения >]

Предикаты
предикаты сравнения { =, <>, >,<,>=,<=,}
предикат Between - принимает значение между а1 и а2
/ Not Between - не принимает значение между а1 и а2
<имя> Between a1 AND a2 или<имя> NOT Between a1 AND a2
предикат IN - входит в множество / не входит
<имя> IN (Подзапрос SubQurery) | ( список значений)
<имя> NOT IN (Подзапрос SubQurery) | ( список значений)
предикат LIKE - включает (подобен)
<имя> Like < образец> или
<имя> Not Like < образец> - не подобен
образец может содержать символы _ подчеркивания для обозначения любого одиночного символа;
% - для обозначения любой произвольной последовательности символов.
предикат NULL - неизвестно, неопределено
<имя> Is Null - является неопределенным
<имя> Not Is Null - не является неопределенным
предикат EXISTS - существует -что-то
EXISTS ( SubQuery) = Истина, когда подзапрос не пуст
Отложив на время знакомство с группировкой, рассмотрим детально первые три строки оператора SELECT:
SELECT ключевое слово, которое сообщает СУБД, что эта команда запрос. Все запросы начинаются этим словом с последующим пробелом. За ним может следовать способ выборки с удалением дубликатов (DISTINCT), или без удаления (ALL, подразумевается по умолчанию). Затем следует список перечисленных через запятую столбцов, которые выбираются запросом из таблиц, или символ *’ для выбора всей строки. Любые столбцы, не перечисленные здесь, не будут включены в вывод команды. Это, конечно, не значит, что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в таблицах он только показывает данные.
FROM ключевое слово, подобно SELECT, которое должно быть представлено в каждом запросе. Оно сопровождается пробелом и затем именами таблиц, используемых в качестве источника информации. В случае если указано более одного имени таблицы, неявно подразумевается, что над перечисленными таблицами осуществляется операция декартова произведения. Таблицам можно присвоить имена-синонимы, что бывает полезно для осуществления операции соединения таблицы с самой собой или для доступа из вложенного подзапроса к текущей записи внешнего запроса (вложенные подзапросы здесь не рассматриваются). В случае задания синонимов имена таблицы отделяются от своего синонима пробелом.
Все последующие части оператора SELECT являются необязательными.
WHERE ключевое слово, за которым следует предикат условие, налагаемое на запись в таблице, которому она должна удовлетворять, чтобы попасть в выборку. Аналогично операции селекции в реляционной алгебре. В условии выборки могут использоваться:
предикаты сравнения (=,<>,>,>=,<,<=);
булевы операторы AND, OR, NOT;
оператор диапазона BETWEEN AND;
проверка принадлежности множеству IN;
сопоставление с образцом LIKE;
проверка поля на наличие значения IS NULL;
проверка на наличие вывода подзапроса EXISTS;
Рассмотрим отношения 13 EMBED Equation.2 1415, 13 EMBED Equation.2 1415, 13 EMBED Equation.2 1415 . Будем считать, что они представлены таблицами R1, R2 и R3 соответственно.
13 EMBED Equation.2 1415;13 EMBED Equation.2 1415;13 EMBED Equation.2 1415,
Приведем несколько примеров использования оператора SELECT.
Список всех групп, где должны пройти экзамены
SELECT Группы FROM R3;
Список студентов, которые сдали экзамен по БД на «отлично»
SELECT ФИО FROM R1 WHERE Дисциплина = (БД( AND Оценка = 5;
Список всех студентов, которым надо что-либо сдавать, вместе с дисциплинами
SELECT ФИО, Дисциплина FROM R2, R3 WHERE R1.Группа = R2.Группа;
Список разгильдяев, имеющих несколько двоек
SELECT ФИО FROM R1 a, R1 b WHERE a.ФИО = b.ФИО AND a.Дисциплина <> b.Дисциплина AND a.Оценка <= 2 AND b.Оценка.<= 2;
Из этих примеров хорошо видно, что логика работы оператора выбора (декартово произведение-селекция-проекция) не совпадает с порядком описания в нем данных (сначала список полей для проекции, потом список таблиц для декартова произведения, потом условие соединения). Дело в том, что SQL изначально разрабатывался для применения конечным пользователем и его стремились сделать возможно ближе к языку естественному, а не к языку алгоритмическому. По этой причине SQL на первых порах вызывает путаницу и раздражение у начинающих его изучать профессиональных программистов, которые привыкли разговаривать с машиной именно на алгоритмических языках.
Применение агрегатных функций и вложенных запросов в операторе выбора13 15
Запросы могут вычислять обобщенное групповое значение полей точно также как и значение одного поля. Это делается с помощью агрегатных функций. Агрегатные функции производят одиночное значение для всей группы таблицы. Список этих функций:

Функция
Результат

COUNT
Количество строк или непустых значений полей, которые выбрал запрос

SUM
Сумма всех выбранных значений данного поля

AVG
Среднеарифметическое значение всех выбранных значений данного поля

MIN
Наименьшее из всех выбранных значений данного поля

MAX
Наибольшее из всех выбранных значений данного поля

Агрегатные функции используются подобно именам полей в операторе SELECT, но с одним исключением: они берут имя поля как аргумент. С SUM и AVG могут использоваться только числовые поля. С COUNT, MAX, и MIN могут использоваться как числовые так и символьные поля. При использовании с символьными полями, MAX и MIN будут транслировать их в эквивалент ASCII, и обрабатывать в алфавитном порядке. Многие программы позволяют использовать вложенные агрегаты, но это является отклонением от стандарта ANSI со всеми вытекающими отсюда последствиями.
Обратившись снова к базе данных «Сессия» (таблицы R1, R2, R3), найдем количество успешно сданных экзаменов:
SELECT COUNT(*) FROM R1 WHERE Оценка > 2;
Это, конечно, отличается от выбора поля, поскольку всегда возвращается одиночное значение, независимо от того, сколько строк находится в таблице. Из-за этого агрегатные функции и поля не могут выбираться одновременно, пока не будет использовано предложение GROUP BY.
Предложение GROUP BY позволяет определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству. Это дает возможность объединять поля и агрегатные функции в едином предложении SELECT. Однако ограничение стандарта SQL разрешает помещать в список результата только левый подсписок полей группировки и любые агрегатные функции или выражения, состоящие из них.
В дальнейшем в качестве примера будем работать не БД «Сессия», а с БД «Банк», состоящей из одной таблицы F, в которой хранится отношение 13 EMBED Equation.2 1415, содержащее информацию о счетах в филиалах некоторого банка:
13 EMBED Equation.2 1415,
поскольку на этой таблице можно ярче проиллюстрировать работу с агрегатными функциями и группировкой.
Например, предположим, что мы хотим найти суммарный остаток на счетах в филиалах. Можно сделать раздельный запрос для каждого из них, выбрав SUM(Остаток) из таблицы для каждого филиала. GROUP BY, однако, позволит поместить их все в одну команду:
SELECT Филиал, SUM(Остаток) FROM F GROUP BY Филиал;
GROUP BY применяет агрегатные функции независимо для каждой группы, определяемой с помощью значения поля Филиал. Группа состоит из всех строк с одинаковым значением поля Филиал, и функция SUM применяется отдельно для каждой такой группы, то есть суммарный остаток на счетах подсчитывается отдельно для каждого филиала. Значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, как и результат работы агрегатной функции. Поэтому мы можем совместить в одном запросе агрегат и поле. Вы можете также использовать GROUP BY с несколькими полями.
Предположим, что мы хотели бы увидеть только те суммарные значения остатков на счетах, которые превышают $5000. Мы не можем использовать агрегатную функцию в предложении WHERE, потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции в терминах групп строк. Чтобы увидеть суммарные остатки свыше $5000, необходимо использовать предложение HAVING. Предложение HAVING определяет критерии, используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк.
Правильной командой будет следующая:
SELECT Филиал, SUM(Остаток) FROM F GROUP BY Филиал HAVING SUM(Остаток) > 5000;
Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода.
Следующая команда будет запрещена:
SELECT Филиал, SUM(Остаток) FROM F GROUP BY Филиал HAVING ДатаОткрытия = 27/12/1997;
Поле ДатаОткрытия не может быть использовано в предложении HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос:
SELECT Филиал, SUM(Остаток) FROM F WHERE ДатаОткрытия = 27/12/1997 GROUP BY Филиал;
Как и говорилось ранее, HAVING может использовать только аргументы, которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции наиболее общие, но и поля выбранные с помощью GROUP BY также допустимы. Например, мы хотим увидеть суммарные остатки на счетах филиалов в СанктПетербурге, Пскове и Урюпинске:
SELECT Филиал, SUM(Остаток) FROM F GROUP BY Филиал HAVING Филиал IN ((СанктПетербург(, (Псков(, (Урюпинск();
Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.
Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть true. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.
Теперь вернемся к БД «Сессия» и рассмотрим на ее примере использование вложенных запросов13 XE «Запрос: вложенный» 1513 XE «Подзапрос» 15.
С помощью SQL можно вкладывать запросы внутрь друг друга. Обычно, внутренний запрос генерирует значение которое, проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего, верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.
В сочетании с другими возможностями оператора выбора, такими как группировка, подзапрос представляет собой мощное средство для достижения нужного результата. В части FROM оператора SELECT допустимо применять синонимы к именам таблицы, если при формировании запроса нам требуется более чем один экземпляр некоторого отношения. Синонимы задаются с использованием ключевого слова AS, которое может быть вообще упущено. Поэтому часть FROM может выглядеть следующим образом:
FROM R1 AS A, R1 AS B или
FROM R1 A, R1 B
- оба выражения эквивалентны и рассматриваются как применения оператора SELECT к двум экземплярам таблицы R1.
Например, покажем, как выглядят на SQL некоторые запросы к БД «Сессия»:
Список тех, кто сдал все положенные экзамены
SELECT ФИО FROM R1 as a WHERE Оценка > 2 GROUP BY ФИО HAVING COUNT(*) = (SELECT COUNT(*) FROM R2,R3 WHERE R2.Группа=R3.Группа AND ФИО=a.ФИО)
Здесь, во встроенном запросе определяется общее число экзаменов, которые должен сдавать каждый студент, обучающийся в группе, в которой учится и данный студент, и это число сравнивается с числом экзаменов, которые сдал данный студент.
Список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал
SELECT ФИО FROM R2 a, R3 WHERE R2.Группа=R3.Группа AND Дисциплина = (БД( AND NOT EXISTS (SELECT ФИО FROM R1 WHERE ФИО=a.ФИО AND Дисциплина = (БД()
Обратите внимание, каким образом NOT EXISTS с вложенным запросом позволяет обойтись без операции разности отношений.

В стандарт SQL92 операторы сравнения расширены до многократных сравнений с использованием ключевых слов ANY и ALL. Это расширение используется при сравнении значения определенного столбца со столбцом данных возвращаемым вложенным запросом.
Например, найдем студентов, которые сдали экзамены на оценку не ниже чем хорошо.
13 EMBED Equation.2 1415;13 EMBED Equation.2 1415;13 EMBED Equation.2 1415,
R4 =<Фио,Дисциплина, Лаб.Работа, Оценка>

Select R1.Фио
From R1
Where 4 > = All (Select R1.Оценка
From R1 as R11
Where R1.Фио = R11.Фио)

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

Select R1.Фио
From R1
Where R1.Оценка >= ANY (Select R4.Оценка
From R4
Where R1.Дисциплина = R4. Дисциплина AND
R1.Фио = R4.Фио)

Операторы манипулирования данными.
В операции манипулирования данными входят три операции: операция удаления записей и ей соответствует оператор DELETE, операция добавления или ввода новых записей и ей соответствует оператор INSERT и операция изменения (обновления записей) и ей соответствует оператор UPDATE. Рассмотрим каждый из операторов подробнее.
Все операторы манипулирования данными позволяют изменить данные только в одной таблице.
Оператор ввода данных INSERT имеет следующий синтаксис:
INSERT INTO имя_таблицы [(<список столбцов>) ] VALUES (<список значений>)
Подобный синтаксис позволяет ввести только одну строку в таблицу. Задание списка столбцов необязательно тогда, когда мы вводим строку с заданием значений всех столбцов. Например Введем новую книгу в таблицу BOOKS
INSERT INTO BOOKS ( ISBN,TITL,AUTOR,COAUTOR,YEARIZD,PAGES)
VALUES (“5-88782-290-2”,”Аппаратные средства IBM PC.Энциклопедия”,”Гук М.”,””,2000,816)

В этой книге только один автор, нет соовторов, но мы в списке столбцов задали столбец COAUTOR, поэтому мы должны были ввести соответствующее значение в разделе VALUES. Мы ввели пустую строку, потому что мы знаем точно, что нет соавтора. Мы могли бы ввести неопределенное значение NULL.
Так как мы вводим полную строку, то мы можем не задавать список столбцов, ограничиться только
заданием перечня значений, в этом случае оператор ввода будет выглядеть следующим образом:

INSERT INTO BOOKS VALUES (“5-88782-290-2”,”Аппаратные средства IBM PC.Энциклопедия”,”Гук М.”,””,2000,816)

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

INSERT INTO BOOKS ( ISBN,TITL,AUTOR,YEARIZD,PAGES)
VALUES (“5-88782-290-2”,”Аппаратные средства IBM PC.Энциклопедия”,”Гук М.”,2000,816)

Столбцу COAUTOR будет присвоено в этом случае значение NULL.
Какие столбцы должны быть заданы при вводе данных? Это определяется тем, как описаны эти столбцы при описании соответствующей таблицы и будет рассмотрено более подробно при описании языка DDL (Data Definition Language) в главе 8. Здесь мы пока отметим, что если столбец или атрибут имеет признак обязательный (NOT NULL) при описании таблицы, то оператор INSERT должен обязательно содержать данные для ввода в каждую строку данного столбца. Поэтому если в таблице все столбцы обязательные, то каждая вводимая строка должна содержать полный перечень вводимых значений, а указание имен столбцов в этом случае необязательно. В противном случае, если имеется хотя бы один необязательный столбец, и Вы не вводите в него значений, задание списка имен столбцов – обязательно.
В набор значений могут быть включены специальные функции и выражение. Ограничением здесь является то, что значения этих функций должны быть определены на момент ввода данных. Поэтому, например мы можем сформировать оператор ввода в таблицу EXEMPLAR следующим образом:

INSERT INTO EXEMPLAR (INV,ISBN,YES_NO,NUM_READER,DATE_IN, DATE_OUT)
VALUES (1872, “5-88782-290-2”,NO,344,GetDate(),DateAdd(d,GetDate(),14))

И это означает, что мы выдали экземпляр книги с инвентарным номером 1872 читателю с номером читательского билете 344, отметив, что этот экземпляр не присутствует с этого момента в библиотеке и определили дату выдачи книги как текущую дату (функция GetDate()), а дату возврата задали двумя неделями позднее, использовав при этом функцию DateAdd (), которая позволяет вк одной дате добавить заданное количество интервалов даты и тем самым получить новое значение типа дата. Мы добавили 14 дней к текущей дате.
Оператор ввода данных позволяет ввести сразу множество строк, если их можно выбрать из некоторой другой таблицы. Допустим, что у нас есть таблица со студентами, и в ней указаны основные данные о студентах: их фамилия, адрес, домашний телефон и дата рождения. Тогда мы можем сделать всех студентов читателями нашей библиотеки одним оператором:
INSERT INTO READER (NAME_READER, ADRESS, HOOM_PHONE, BIRTH_DAY)
SELECT (NAME_STUDENT, ADRESS, HOOM_PHONE, BIRTH_DAY)
FROM STUDENT
При этом номер читательского билета может назначаться автоматически, поэтому мы не вводим значения этого столбца в таблицу. Кроме того, мы предполагаем, что у студентов дневного отделения еще нет работы и поэтому нет рабочего телефона и ы его не вводим.
Оператор удаления данных позволяет удалить одну или несколько строк из таблицы в соответствии с условиями, которые задаются для удаляемых строк.
Синтаксис оператора DELETE следующий:
DELETE FROM имя_таблицы [WHERE условия_отбора]
Если условия отбора не задаются, то из таблицы удаляются все строки, однако это не означает, что удаляется вся таблицы. Исходная таблица остается, но она остается пустой, незаполненной.
Например, если нам надо удалить результаты прошедшей сессии, то мы можем удалить все строки из отношения R1 командой
DELETE FROM R1
Условия отбора в части WHERE имеют тот же вид, что и условия фильтрации в операторе SELECT. Эти условия определяют, какие строки из исходного отношения будут удалены. Например, если мы исключим студента Миронова А.В. , то мы должны написать следующую команду:
DELETE FROM R2
WHERE ФИО = Миронов А.В.’
В части WHERE может находиться встроенный запрос.

Все операции манипулирования данными связаны с понятием целостности базы данных. В настоящий момент мне бы хотелось отметить только то, что операции манипулирования данными не всегда выполнимы, даже если синтаксически они написаны правильно. Действительно, если мы бы захотели удалить какую-нибудь группу из отношения R3, то СУБД не позволила бы нам это сделать, так как в отношениях R1 и R2 есть строки, связанные с удаляемой строкой в отношении R3. Почему так делается мы узнаем позднее, а пока просто примем к сведению, что не все операторы манипулирования выполнимы.
Операция обновления данных UPDATE требуется тогда, когда происходят изменения во внешнем мире и их надо адекватно отразить в базе данных, так как надо всегда помнить, что база данных отражает некоторую предметную область. Например, в нашем учебном заведении произошло счастливое событие, которое связано с тем, что госпожа Степанова К.Е. пересдала экзамен по дисциплине «Базы данных» с двойки сразу на четверку. В этом случае нам надо срочно выполнить соответствующую корректировку таблицы R1. Операция обновления имеет следующий формат:
UPDATE имя_таблицы
SET имя_столбца = новое_значение
[WHERE условие_отбора]
Часть WHERE является необязательной, также как и в операторе DELETE. Она играет здесь туже роль, что и операторе DELETE  позволяет отобрать строки, к которым будет применена операция модификации. Если условие отбора не задается, то операция модификации применяется ко всем строкам таблицы.
Для выполнения ранее поставленной задачи нам необходимо выполнить следующую операцию
UPDATE R1
SET R1.Оценка = 4
WHERE R1.ФИО = “Степанова К.Е.” AND R1.Дисциплина = “Базы данных”
В каких случаях требуется провести изменение в нескольких строках? Это не такая уж редкая задача. Например, если мы расширим нашу учебную базу данных еще одним отношением, которое содержит перечень курсов, на которых учатся наши студенты, то можно с помощью операции обновления промоделировать операцию перевода групп на следующий курс. Пусть новое отношение R4 имеет следующую схему:
R4 <Группа, Курс>
Группа
Курс

4906
3

4807
4


В этом случае перевод на следующий курс модно выполнить следующей операцией обновления:
UPDATE R4
SET R4.Курс = R4.Курс + 1
И результат будет выглядеть следующим образом:
Группа
Курс

4906
4

4807
5



DDL (Data Definition Language)
CREATE TABLE (T-SQL)
CREATE TABLE [ database_name.[owner]. | owner. ] table_name ( { <определение_столбца> | имя_столбца AS вычисляемое выражение | < ограничение_таблицы> } [,...n] ) [ON {filegroup | DEFAULT} ] [TEXTIMAGE_ON {filegroup | DEFAULT} ]

::= {имя_столбца тип_данных } [ [ DEFAULT значение_по_умолчанию ] | [ IDENTITY [(seed, increment ) [NOT FOR REPLICATION] ] ] ] [ ROWGUIDCOL ] [ <ограничение_столбца >] [ ...n]

<ограничение_столбца> ::= [CONSTRAINT имя_ограничения] { [ NULL | NOT NULL ] | [ { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] [WITH FILLFACTOR = %заполнения
·] [ON {filegroup | DEFAULT} ]] ] | [ [FOREIGN KEY] REFERENCES имя_таблицы [(имя_колонки) ] [NOT FOR REPLICATION] ] | CHECK [NOT FOR REPLICATION] (логическое_выражение) }

<ограничение_таблицы> ::= [CONSTRAINT имя_ограничения] { [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED] { ( имя_столбца[,...n] ) } [ WITH FILLFACTOR = %заполнения] [ON {filegroup | DEFAULT} ] ] | FOREIGN KEY [(имя_столбц[,...n])] REFERENCES имя_таблицы [(имя_столбца[,...n])] [NOT FOR REPLICATION] | CHECK [NOT FOR REPLICATION] (логическое_выражение) }


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

ON {filegroup | DEFAULT} определяет файловую группу, в которой будут храниться кортежи данной таблицы. Если файловая группа не специфицирована, то данные размещаются в файловой группе, которая назначена по умолчанию
ON {filegroup | DEFAULT} может также задаваться при задании ограничений типа PRIMARY KEY или UNIQUE . Оба эти ограничения подразумевают обязательное создание индексных файлов. Если файловые группы определены в этих ограничениях, то в них хранятся индексные файлы.
Если при описании ограничений типа PRIMARY KEY или UNIQUE определен кластеризованный индекс, то страницы данных хранятся в той же файловой группе, что и индекс.
TEXTIMAGE_ON Эти ключевые слова определяют, где будут храниться данные неструктурированных типов text, ntext, image. Если под эти данные отдельно не специфицирована файловая группа, то они будут храниться в тойже файловой группе, что и основные данные.
IDENTITY это специальное свойство, которое задает инкрементированное поле. Это свойство может быть определено только для следующих типов данных: tinyint, smallint, int, decimal(p,0), or numeric(p,0). В таблице может быть создано только одно поле со свойством IDENTITY. При этом для полей с данным свойством не задается ограничение типа DEFAULT.
Параметры свойства IDENTITY
seed - начальное значение
increment - шаг.
NOT FOR REPLICATION - эти ключевые слова для свойства IDENTITY показывают, что при репликации передаваемые в базу данных подписчика данные приходят уже со своими значениями данного поля и поэтому не требуют выполнения операции инкрементирования.
ROWGUIDCOL - это ключевое слово означает, что данный столбец хранит значения уникального идетификатора. Разрешено иметь только один уникальный идентификатор uniqueidentifier на таблицу. Этот параметр задается для БД, созданных только на сервере начиная с 7.0
Для ввода данных в столбец с данным свойством требуется использовать специальную функцию NEWID.

CONSTRAINT - это ключевое слово определяет ограничения на уровне столбца или на уровне таблицы.

Временные таблицы (Temporary Tables)
Вы можете создать локальные или глобальные временные таблицы.
Локальные временные таблицы видны только пока работает приложение их создавшее.
Локальные временные таблицы предваряются префиксом #имя_таблицы.
Глобальные временные таблицы видны пока работает сервер, на котором работает БД, где они были созданы. Глобальные таблицы предваряются префиксом ##имя_таблицы.

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

Если временная таблица создается в хранимой процедуре или приложении, которое может быть исполнено множеством пользователей, то для того, чтобы различать таблицы, созданные разными пользователями SQL-сервер добавляет к их имени специальный числовой суффикс, поэтому существуют ограничения на длину имени локальной временной таблицы – не более 116 символов.
Временные таблицы уничтожаются автоматически, котгда инивыходят из области видимости, но они могут быть удалены так же командой DROP TABLE.
Локальные временные таблицы, созданные в хранимой процедуре, уничтожаются автоматически после выполнения хранимой процедуры. На эти таблицы нельзя ссылаться из процедур, вызываемых из данной процедуры.
Все локальные временные таблицы уничтожаются автоматически по концу текущей сессии.
Глобальные таблицы удаляются автоматически когда заканчивает работу сесиия, в которой они были созданы и когда закончил работу все задачи, которые их используют.
При создании временных таблиц нельзя задавать ограничения типа FOREIGN KEY, кроме того для временных таблиц нельзя создавать триггеры.

DEFAULT ограничение значения по умолчанию
Значение по-умолчанию подставляется во вновь вводимую строку в том случае, если явным образом не задано никакое другое значение.
Выражение условия по умолчанию DEFAULT не может включать ссылки на другие столбцы.
Хранимые процедуры
DEFAULT условие не может быть задано для столбцов с типом данных timestamp или свойством IDENTITY .
DEFAULT не может быть задано для пользовательских типов данных.

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

Пример оператора create table

CREATE TABLE BOOKS
(
ISBN varchar(14) NOT NULL PRIMARY KEY,
TITLE varchar(120) NOT NULL,
AUTOR varchar (30) NULL,
COAUTOR varchar(30) NULL,
YEAR_PUBL smallint DEFAULT Year(GetDate()) CHECK(YEAR_PUBL >= 1960 AND YEAR_PUBL <= YEAR(GetDate())),
PUBLICH varchar(20) NULL,
PAGES smallint CHECK(PAGES > = 5 AND PAGES <= 1000)
);


Почему мы не задали обязательность значения для количества страниц в книге? Потому что это является следствием проверочного ограничения, заданного на количество страниц, количество страниц всегда должно лежать в пределах от 5 до 1000, значит оно не может быть незаданным и система это контролирует автоматически.
Теперь зададим описание таблицы «Читатели», которой соответствует отношение READERS.
Номер читательского билета это целое число в пределах 32 000 и он уникально определяет читателя.
Имя, фамилия читателя – это последовательность символов не более 30.
Адрес – это последовательность символов не более 50.
Номера телефонов рабочего и домашнего – последовательность символов не более 12.
Дата рождения – календарная дата. В библиотеку принимаются читатели не младще 17 лет.
CREATE TABLE READERS
(
READER_ID Smallint(4) PRIMARY KEY,
FIRST_NAME char(30) NOT NULL,
LAST_NAME char(30) NOT NULL,
ADRES char(50) ,
HOME_PHON char(12) ,
WORK_PHON char(12) ,
BIRTH_DAY date CHECK( DateDiff(year, GetDate(),BIRTH_DAY) >=17 )
);

Здесь DateDiff (часть даты, начальная дата, конечная дата) – функция MS SQL Server 2000, которая определяет разность между начальной и конечной датами, заданную в единицах определенных первым параметром - часть даты. Мы задали в качестве параметра Year, что значит, что мы разность определяем в годах.
Теперь зададим операцию создания таблицы EXEMPLAR (экземпляры книги). В этой таблице первичным ключом является атрибут, задающий инвентарный номер экземпляра книги. В такой постановке мы полагаем, что при поступлении книг в библиотеку им просто присваиваются соответствующие порядковые номера. Для того, чтобы не утруждать библиотекаря все время помнить какой номер был последним, мы можем воспользоваться тем, что некоторые СУБД допускают специальный инкрементный тип данных, т.е. такой, значения которого автоматически увеличиваются или уменьшаются на заданную величину прикаждом новом вводе данных. В СУБД MS Access такой тип данных называется «счетчик» (counter) и он всегда имеет начальное значение 1 и шаг равный тоже 1, т.е. каждое новое значение типа счетчик увеличивается на 1, значит практически считает вновь введенные значения. В СУБД MS SQL Server7.0 это свойство IDENTITY, которое может быть присвоено ряду целочисленных типов данных. В отличие от «счетчика» свойство IDENTITY позволяет считать с любым шагом, положительным или отрицательным, но обязательно целым. Если мы не задаем дополнительных параметров этому свойству, то оно начинает работать как счетчик в MS Access, начиная с единицы и добавляя при каждом вводе тоже единицу.
Кроме того, таблица EXEMPLAR является подчиненной двум другим ранее определенным таблицам: BOOKS и READERS. При этом стаблицей BOOKS таблица EXEMPLAR связана обязательной связью, потому что не может быть ни одного экземпляра книги, который бы не был приписан конкретной книге. С таблицей READERS таблица EXEMPLAR связана необязательной связью, потому что не каждый экземпляр в данный момент находится на руках у читателя. Для моделирования этих связей при создании таблицы EXEMPLAR должны быть определены два внешних ключа (FOREIGN KEY). При этом атрибут, соответствующий шифру книги (мы его назовем так же как и в родиьельской таблице ISBN) является обязательным, т.е. не может принимать неопределенных значений, а атрибут, который является внешним ключом по для связи с таблице READERS является необязательным и может принимать неопределенные значения.
Необязательными там являются два остальных атрибута: дата взятия и дата возврата книги, оба они имеют тип данных, соответствующей календарной дате. Атрибут, который содержит информацию о присутствии или отсутствии книги имеет логический тип. Напишем оператор создания таблицы EXEMPLAR в синтаксите MS SQL Server 2000
CREATE TABLE EXEMPLAR
(
EXEMPLAR_ID INT IDENTITY PRIMARY KEY,
ISBN varchar(14) NOT NULL FOREIGN KEY references BOOKS(ISBN),
READER_ID Smallint(4) NULL FOREIGN KEY references READERS (READER_ID),
DATA_IN date ,
DATA_OUT date ,
EXIST Logical ,
);

Как мы уже знаем, не все декларативные ограничения могут быть заданы на уровне столбцов таблицы, часть ограничений могут быть заданы только на уровне всей таблицы. Например, если мы имеем в качестве первичного ключа не один атрибут, а последовательность атрибутов, то мы не можем определить ограничение типа PRIMARY KEY (первичный ключ) только на уровне всей таблицы.
Допустим, что мы считаем экземпляры книги не подряд, а отдельно для каждого издания, тогда таблица EXEMPLAR в качестве первичного ключа будет иметь набор из двух атрибутов: это шифр кинги (ISBN) и порядковый номер экземпляра данной книги (ID_EXEMPL), в этом случае оператор создания таблицы EXEMPLAR будет выглядеть следующим образом:
CREATE TABLE EXEMPLAR
(
ID_EXEMPLAR int NOT NULL,
ISBN varchar(14) NOT NULL FOREIGN KEY references BOOKS(ISBN),
READER_ID Smallint(4) NULL FOREIGN KEY references READERS (READER_ID),
DATA_IN date ,
DATA_OUT date ,
EXIST Logical ,
PRIMARY KEY (ID_EXEMPLAR, ISBN)
);

Для анализа ошибок целесообразно именовать все ограничения, особенно если таблица содержит несколько ограничений одного типа. Для именования ограничений используется ключевое слово CONSTRAINT, после которого следует уникальное имя ограничения, затем тип ограничения и его выражения. Для идентификации ограничений рекомендуют использовать систему именования, которая легко позволит определить при получении сообщения об ошибке, которое вырабатывает СУБД какое ограничение нарушено. Обычно имя ограничения состоит из краткого названия типа ограничения, далее через символ подчеркивания идет имя атрибута или таблицы, в зависимости от того к какому уровню относится ограничение и наконец порядковй номер ограничения данного типа, если к одному объекту задается несколько ограничений одного типа.
Сокращенные обозначения ограничений состоят из одной или двух букв и могут быть следующими:
PK – для первичного ключа;
FK – для внешнего ключа;
CK – для проверочного ограничения;
U – для ограничения уникальности;
DF – для ограничения типа значение по умолчанию.
Приведем пример оператора создания таблицы BOOKS с именованноми ограничениями:
CREATE TABLE BOOKS
(
ISBN varchar(14) NOT NULL ,
TITLE varchar(120) NOT NULL,
AUTOR varchar (30) NULL,
COAUTOR varchar(30) NULL,
YEAR_PUBL smallint NOT NULL,
PUBLICH varchar(20) NULL,
PAGES smallint NOT NULL,
CONSTRAINT PK_BOOKS PRIMARY KEY (ISBN),
CONSTRAINT DF_ YEAR_PUBL DEFAULT (Year(GetDate()),
CONSTRAINT CK_ YEAR_PUBL CHECK (YEAR_PUBL >= 1960 AND YEAR_PUBL <= YEAR(GetDate())),
CONSTRANT CK_PAGES CHECK (PAGES > = 5 AND PAGES <= 1000),
CONSTRAINT CK_BOOKS CHECK (NOT (AUTOR IS NULL AND COAUTOR IS NOT NULL))
);
CREATE TABLE READERS
(
READER_ID Smallint PRIMARY KEY,
FIRST_NAME char(30) NOT NULL,
LAST_NAME char(30) NOT NULL,
ADRES char(50) ,
HOME_PHON char(12) ,
WORK_PHON char(12) ,
BIRTH_DAY date CHECK( DateDiff(year, GetDate(),BIRTH_DAY) >=17 ),
CONSTRAINT CK_READERS CHECK (HOME_PHON IS NOT NULL OR WORK_PHON IS NOT NULL)
);
CREATE TABLE CATALOG
(
ID_CATALOG Smallint PRIMARY KEY,
KNOWELEDGE_AREA varchar(150)
);
CREATE TABLE EXEMPLAR
(
ID_EXEMPLAR int NOT NULL,
ISBN varchar(14) NOT NULL FOREIGN KEY references BOOKS(ISBN),
READER_ID Smallint(4) NULL FOREIGN KEY references READERS (READER_ID),
DATA_IN date ,
DATA_OUT date ,
EXIST Logical ,
PRIMARY KEY (ID_EXEMPLAR, ISBN)
);
CREATE TABLE RELATION_1
(
ISBN varchar(14) NOT NULL FOREIGN KEY references BOOKS(ISBN),
ID_CATALOG smallint NOT NULL FOREIGN KEY references CATALOG(ID_CATALOG),
CONSTRAINT PK_RELATION_1 PRIMARY KEY (ISBN,ID_CATALOG)
).
Операторы языка SQL, как указывалось ранее, транслируются в режиме интерпретации, в отличие большинства алгоритмических языков, трансляторы для которых выполнены по принципу компиляции. В режиме интерпретации каждый оператор отдельно транслируется, т.е. переводится в машинные коды и тут же выполняется. В режиме компиляции вся программа, т.е. совокупность операторов сначала переводится в машинные коды, а затем может быть выполнена, как единое целое. Такая особенность SQL накладывает ограничение на порядок описания создаваемых таблиц, действительно, если при трансляции оператора описания подчиненной таблицы с указанным внешним ключом и соответствующей ссылкой на родительскую таблицу эта родительская таблица не будет обнаружена, то мы получим сообщение об ошибке с указанием ссылки на несуществующий объект. Сначала должны быть описаны все основные таблицы, а потом подчиненные таблицы.
В нашем примере с библиотекой порядок описания таблиц следующий:
Таблица BOOKS
Таблица READERS
Таблица CATALOG (системный каталог)
Таблица EXEMPLAR
Таблица RELATION_1 (дополнительная связующая таблица между книгами и системным каталогом).
Набор операторов языка SQL принято называть не программой, а скриптом. Тогда скрипт, который добавит набор из 5 взаимосвязанных таблиц базы данных «Библиотека» в существующую базу данных, будет выглядеть следующим образом:
CREATE TABLE BOOKS
(
ISBN varchar(14) NOT NULL ,
TITLE varchar(120) NOT NULL,
AUTOR varchar (30) NULL,
COAUTOR varchar(30) NULL,
YEAR_PUBL smallint NOT NULL,
PUBLICH varchar(20) NULL,
PAGES smallint NOT NULL,
CONSTRAINT PK_BOOKS PRIMARY KEY (ISBN),
CONSTRAINT DF_ YEAR_PUBL DEFAULT (Year(GetDate()),
CONSTRAINT CK_ YEAR_PUBL CHECK (YEAR_PUBL >= 1960 AND YEAR_PUBL <= YEAR(GetDate())),
CONSTRANT CK_PAGES CHECK (PAGES > = 5 AND PAGES <= 1000),
CONSTRAINT CK_BOOKS CHECK (NOT (AUTOR IS NULL AND COAUTOR IS NOT NULL))
CREATE TABLE READERS
(
READER_ID Smallint PRIMARY KEY,
FIRST_NAME char(30) NOT NULL,
LAST_NAME char(30) NOT NULL,
ADRES char(50) ,
HOME_PHON char(12) ,
WORK_PHON char(12) ,
BIRTH_DAY date CHECK( DateDiff(year, GetDate(),BIRTH_DAY) >=17 ),
CONSTRAINT CK_READERS CHECK (HOME_PHON IS NOT NULL OR WORK_PHON IS NOT NULL)
);

CREATE TABLE CATALOG
(
ID_CATALOG Smallint PRIMARY KEY,
KNOWELEDGE_AREA varchar(150)
);
CREATE TABLE EXEMPLAR
(
ID_EXEMPLAR int NOT NULL,
ISBN varchar(14) NOT NULL FOREIGN KEY references BOOKS(ISBN),
READER_ID Smallint(4) NULL FOREIGN KEY references READERS (READER_ID),
DATA_IN date ,
DATA_OUT date ,
EXIST Logical ,
PRIMARY KEY (ID_EXEMPLAR, ISBN)
);
CREATE TABLE RELATION_1
(
ISBN varchar(14) NOT NULL FOREIGN KEY references BOOKS(ISBN),
ID_CATALOG smallint NOT NULL FOREIGN KEY references CATALOG(ID_CATALOG),
CONSTRAINT PK_RELATION_1 PRIMARY KEY (ISBN,ID_CATALOG)
).
При написании скрипта мы добавили в оператор создания таблицы читатели ограничение на уровне таблицы, которое связано с обязательным наличием хотя бы одного из двух телефонов.

Средства определения схемы базы данных
В стандарте SQL1 задается спецификация оператора описания схемы базы данных, но не указывается способ создания собственно базы данных, поэтому в различных СУБД используются неодинаковые подходы к этому вопросу.
Например в СУБД ORACLE база данных создается в ходе установки программного обеспечения собственно СУБД. Все таблицы пользователей помещаются в единую базу данных. Однако они могут быть разделены на подсхемы. Понятие подсхемы не стандартизировано в SQL и используется и в других СУБД такого понятия не существует.
В состав СУБД INGRES входит специальная системная утилита, имеющая имя CREATEDB, которая позволяет создавать новые базы данных. Права на использование этой утилиты имеет администратор сервера. Для удаления базы данных существует соответствующая утилита DESTROYDB.
В СУБД MS SQL Server существует специальный оператор CREATE DATABASE, который является частью языка определения данных, для удаления базы данных в языке определен оператор DROP DATABASE. Правами на создания баз данных наделяются администраторы баз данных, которых в общем случае может быть несколько. Правами более высокого уровня обладает администратор сервера баз данных (SQL Server), который и может предоставить права администратора базы данных другим пользователям сервера. Администратоы баз данных могут удалить только свою базу данных, т.е. ту, администратором которой они являются. Приведем пример оператора создания схемы базы данных в MS SQL Server 2000
CREATE DATABASE database_name
[ON [PRIMARY][<спецификация файла>[,...n]][,<группа файлов> [,...n]]][ LOG ON { <спецификация файла> [,...n]} ][ FOR LOAD | FOR ATTACH ]

<спецификация файла> ::=
( [ NAME = логическое имя файла,]FILENAME = 'физическое имя файла' [, SIZE = размер][, MAXSIZE = { максимальный размер | UNLIMITED } ] [, FILEGROWTH = инкремент увеличения файла] ) [,...n]
<группа файлов>::= FILEGROUP имя группы файлов <спецификация файла> [,...n]
Здесь
database_name имя базы данных, идентификатор в системе
ON - ключевое слово, которое означает, что далее будут заданы спецификации файлов, которые будут использованы для размещения базы данных.
PRIMARY - ключевое слово, которое определяет первичное файловое пространство, в котором будет размещена собственно база данных.
LOG ON - ключевое слово, которое задает спецификацию файлов, которые будут использованы для хранения журналов транзакций.
FOR LOAD - ключевое слово, которое определяет, что после создания базы данных будет произведена загрузка базы данных данными.
FOR ATTACH - предложение, которое определяет, что база данных для управления будет подсоединена к другому серверу.
Почти все параметры кроме имени базы данных являются необязательными, поэтому оператор создания простой базы данных библиотека может выглядеть следующим образом:
CREATE DATABASE Library
Для изменения схемы базы данных в MS SQL Server 2000 может быть использована команда
ALTER DATABASE database
{ ADD FILE <спецификация файлов> [,...n] [TO FILEGROUP filegroup_name]
| ADD LOG FILE <спецификация файлов> [,...n]
| REMOVE FILE имя_файла
| ADD FILEGROUP имя_группы файлов
|REMOVE FILEGROUP имя группы_файлов
|MODIFY FILE <спецификация файлов>
|MODIFY FILEGROUP имя_группы_файлов имя_свойства_группы файлов}
Здесь свойства группы файлов одно из допустимых ключевых слов:
READONLY - только для чтения
READWRITE - для чтения и записи
DEFAULT - назначает данную группу файлов в качестве группы по умолчанию, в которой размещаются данные, если не задано дополнительных условий размещения информации.
Как видно при изменении схемы базы данных, в нее могут быть добавлены (ADD) дополнительные файлы и файловые группы, или удалены (REMOVE) ранее определенные файлы или файловые группы. Назначение этих файлов нам будет более понятно после того, как мы познакомимся с физическими моделями и файловыми структурами, используемыми для хранения данных в базах данных.
Сейчас мы познакомимся с последней командой, которая предназначена для удаления базы данных. В MS SQL Server 2000 это команда имеет следующий синтаксис:
DROP DATABASE database_name
После выполнения этой команды уничтожается вся база данных вместе с содержащимися в ней данными

Средства изменения описания таблиц и средства удаления таблиц
В язык SQL добавлены средства изменения схемы таблиц. Что можно и что нельзя изменять в описании таблицы? В стандарте SQL2 добавлены достаточно широкие возможности по модификации уже существующих схем таблиц. Для модификации таблиц используется оператор ALTER TABLE, который позволяет выполнить следующие операции изменения для схемы таблицы:
можно добавить новый столбец в уже существующую и заполненную таблицу;
изменить значение по умолчанию для какого-либо столбца;
можно удалить столбец из существующей таблицы;
добавить или удалить первичный ключ таблицы;
добавить или удалить новый внешний ключ таблицы;
добавить или удалить условие уникальности;
добавить или удалить условие проверки для любого столбца или для таблицы в целом.

Синтаксис оператора ALTER TABLE:
<Изменить описание таблицы>::= ALTER TABLE <имя таблицы>
{ ADD <определение столбца> |
ALTER <имя столбца> {SET DEFAULT <значение>
DROP DEFAULT } |
DROP <имя столбца> {CASCADE | RESTRICT} |
ADD { <определение первичного ключа>|
<определение внешнего ключа> |
< условие уникальности данных> |
< условие проверки> } |
DROP CONSTRAINT имя условия { CASCADE |
RESTRICT}
}
Одним оператором ALTER TABLE можно провести только одно из перечисленных изменений, например за один раз можно добавить один столбец, если Вам требуется добавить два столбца, то необходимо применить два оператора.
Давайте рассмотрим несколько примеров. Чаще всего применяется операция добавления столбца. Предложение определения нового столбца в операторе ALTER TABLE имеет точно такой же синтаксис, как и в операторе создания таблицы. Добавим столбец EDUCATION (образовние) , это симовльный типа данных, с заданным перечнем значений (“начальное”, “среднее”, “ неоконченное высшее”, “высшее”).
ALTER TABLE READERS
ADD EDUCATION varchar (30) DEFAULT NULL
CHECK (EDUCATION IS NULL OR
EDUCATION= “начальное” OR
EDUCATION= “среднее ” OR EDUCATION= “неоконченное высшее” OR
EDUCATION= “ высшее” )
В таблицу READERS будет добавлен столбец EDUCATION, в который по умолчанию будут добавлены во все кортежи неопределенные значения. В дальнейщем эти значения могут быть заменены на одно из допустимых символьных значений.
Добавим ограничение на соответствие между датами взятия и возврата книги в таблице EXEMPLAR. Действительно, если даты введены, то требуется, чтобы дата возврата книги была бы более на срок выдачи книги. Считаем, что стандартным сроком является 2 недели. Теперь сформулируем оператор изменения таблицы EXEMPLARE.
ALTER TABLE EXEMPLARE
ADD CONSTRAINT CK_ EXEMPLARE CHECK ((DATA_IN IS NULL AND DATA_OUT IS NULL) OR (DATA_OUT >= DATA_IN +14) )
Здесь мы применили операцию сложения к календарной дате, которая предполагает, что добавляют заданное число дней.
Операция удаления столбца связана с проверкой ссылочной целостности и поэтому не разрешается удалять столбцы, связанные с поддержкой ссылочной целостности таблицы, т.е. нельзя удалить столбцы родительской таблицы, входящие в первичный ключ таблицы, если на них есть ссылки в подчиненных таблицах.
При изменении первичного ключа таблицы следует быть внимательными. Во первых у Вас могут быть подчиненные таблицы у исходной, при этом первичный ключ исходной таблицы является внешним ключом для подчиненных таблиц и просто его удалить невозможно, СУБД контролирует ссылочную целостность и не позволит выполнить операцию удаления первичного ключа таблицы, если на него имеются ссылки.

В языке SQL присутствует и операция удаления таблиц. Синтаксис этой операции предельно прост:
<Удалить таблицу>::= DROP TABLE <имя таблицы>

». Однако операция удаления объектов определяется еще правами пользователей, что связано с концепцией безопасности в базах данных. Это значит, что если Вы не являетесь владельцем объекта, то Вы можете не иметь прав на его удаление. И в этом случае синтаксически правильный оператор DROP TABLE не может быть выполнен системой в силу отсутствия прав на удаление связанных с удаляемой таблицей объектов. Кроме того операция удаления таблицы не должна нарушать целостность базы данных, поэтому удалять таблицу, на которую имеются ссылки других таблиц невозможно.
Например, в нашей схеме, связанной с библиотекой мы не можем удалить ни таблицу BOOKS, ни таблицу READERS, ни таблицу CATALOG. У этих таблиц есть связь с подчиненными таблицами EXEMPLAR и RELATION_67. Поэтому, если Вы хотите удалить некоторый набор таблиц, то сначала необходимо грамотно построить последовательность их удаления, которая не нарушит базовых принципов поддержки целостности Вашей схемы БД. В нашем примере последовательность операторов удаления таблиц может быть следующей:
DROP TABLE EXEMPLAR
DROP TABLE RELATION_67
DROP TABLE CATALOG
DROP TABLE READERS
DROP TABLE BOOKS

Понятие представления (View) и операции создания представлений

Для описания внешних моделей в реляционной модели могут использователься представление. Представление (View ) – это SQL-запрос на выборку, который пользователь воспринимает как некоторое виртуальное отношение. Задание представлений входит в описание схемы БД в реляционных СУБД. Представления позволяют скрыть ненужные несущественные детали для разных пользователей, позволяют модифицировать реальные структуры данных в удобном для приложений виде и наконец позволяют разграничить права доступа к данным, и тем самым повысить защиту данных от несанкционированного доступа.
В отличие от реальной таблицы представление в том виде, как оно сконструировано не существует в базе данных, это действительно только виртуальное отношение, хотя все данные которые представлены в отношении, действительно существуют в базе данных, но в разных отношениях. Они скомпонованы для пользователя в удобнов виде из реальных таблиц с помощью некоторого запроса. Однако пользователь может этого не знать, он может обращаться с этим представлением как со стандартной таблицей. Представление при создании получает некоторое уникальное имя, его описание хранится в описании схемы базы данных, и СУБД в любой момент времени при обращении к этому представлению выполняет запрос, соответствующий его описанию, поэтому пользователь, работая с представлением в каждый момент времени видит действительно реальные актуальные на настоящий момент данные, оно формируется как бы налету, в момент обращения.
Оператор определения представления имеет следующий вид:
<создание представления>::= CREATE VIEW <имя представления>
[ (<список столбцов>)] AS
При необходимости в представлении можно задать новое имя для каждого столбца виртуальной таблицы. При этом надо помнить, что если указывается список столбцов, то он должен содержать ровно столько столбцов, сколько содержит их SQL-запрос.
Если список имен столбцов в представлении не задан, то каждый столбец представления получает имя соответствующего столбца запроса.






13PAGE 15


13PAGE 14115



Компонент доступа к информационным ресурсам

Компонент представления
_________________________
Прикладной компонент

сервер

Компонент ! Прикладной
представления ! компонент

Компонент доступа
к ресурсам

Компонент
представления

Прикладной Компонент доступа к компонент данным

компонент

Мониторинг текущего состояния БД



 
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·в 
·
·
·
·
·
·
·
·
·
·
·
·
·эRoot EntryEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation Native

Приложенные файлы

  • doc 7066426
    Размер файла: 237 kB Загрузок: 0

Добавить комментарий