
- •Лекции по курсу «Базы данных» для студентов факультета вычислительной математики и кибернетики кгу
- •Системы управления базами данных, их состав и назначение. Файловые и клиент-серверные субд.
- •2. Типы базы данных. Реляционные, иерархические, сетевые, объектно-ориентированные базы данных.
- •Основные понятия теории баз данных. Поиск данных и пользовательские запросы.
- •4. Проектирование предметной области. Объекты и атрибуты предметной области. Связи между объектами типа 1:1, 1:m, m:n.
- •Первичные ключи и индексы
- •Реляционные отношения между таблицами Отношение один-ко-многим
- •Отношение один-к-одному
- •Отношение многие-ко-многим
- •Оператор переименования атрибутов.
- •Теоретико-множественные операторы:
- •Объединение
- •Пересечение
- •3. Вычитание
- •4. Декартово произведение
- •Специальные реляционные операторы
- •5. Выборка (ограничение, селекция)
- •Проекция
- •6. Соединение
- •7. Деление
- •Примеры использования реляционных операторов
- •Кросс-таблицы.
- •Ключи отношений. Их роль и использование в базах данных.
- •Связи между отношениями. Внешние ключи. Проблема целостности внешних ключей.
- •Функциональные зависимости. Аксиоматическая система функциональных зависимостей. Теорема полноты.
- •1. Аксиоматика функциональных зависимостей Армстронга.
- •Покрытия функциональных зависимостей. Структура неизбыточных покрытий.
- •Нормальные формы баз данных. Первая, вторая и третья нормальные формы. Нормальная форма Бойса- Кодда.
- •Вторая Нормальная Форма.
- •Отношение сотрудники_отделы
- •Отношение проекты
- •Отношение задания
- •3 Нормальная форма.
- •Отношение сотрудники
- •Отношение отделы
- •Нормализация баз данных. Алгоритм приведения к 3-й нормальной форме с помощью кольцевых зависимостей.
- •Метод «Entity-Relationship». Проектирование структуры баз данных с помощью er-диаграмм. Пример.
- •Физическая организация баз данных.
- •2. Блочный поиск.
- •3. Двоичный поиск.
- •4. Поиск в индексно-последовательном файле.
- •6. Поиск в сбалансированном дереве.
- •7. Перемешивание.
- •8. Комбинация вышеперечисленных способов.
- •Организация баз данных с помощью хеширования. Влияние на эффективность хеширования размеров блока, плотности заполнения и выбора алгоритма хеширования.
- •2. Деление.
- •3. Сдвиг разрядов.
- •4. Преобразование системы исчисления.
- •Язык sql. Команды create, select, insert, alter, update, drop.
- •Простая выборка
- •Использование операторов сравнения
- •Использование in
- •Использование like
- •Выборка с упорядочением
- •Применение агрегатных функций sum, max, min, average в предложении select.
- •Функции без использования фразы group by
- •Фраза group by
- •Использование фразы having
- •19. Организация сложных запросов с помощью команды select.
- •Декартово произведение таблиц
- •Соединение таблицы со своей копией
- •Простые вложенные подзапросы
- •Объединение (union)
- •Организация клиент–серверных бд. Модели технологий «клиент–сервер».
- •Технологии доступа к данным. Система драйверов odbc. Источники данных. Создание dsn-файла.
- •Модели безопасность данных. Мандатный и дискреционный подход к обеспечению безопасности данных. Передача и отзыв привилегий пользователей с помощью предложения grant.
- •26.Безопасность баз данных. Средства защиты бд access.
- •31. Использование внешних данных в Access. Создание страниц доступа к данным и загрузка внешних баз данных. Выполнение sql-запросов к серверу ms sql Server.
- •I. Создание html-страницы доступа к данным
- •II. Загрузка в Access базы данных c сервера и работа с ней.
- •III. Выполнение в Access запросов к внешним таблицам, хранящимся на ms sql Server.
- •Совместная работа Access и ms sql Server, работа с удаленными данными на сервере. Использование утилиты Query Analyzer.
- •Работа с внешними данными с помощью технологии odbc
- •Команды Transact-sql
- •Создание представлений
- •Создание триггеров
- •37. Raid массивы и уровни их организации.
Команды Transact-sql
Теперь, когда мы подошли к вопросу создания приложений клиент-сервер, настала пора продолжить изучение следующего набора SQL команд. Помните, что все они доступны из любого средства разработки приложений, которое либо поддерживает ODBC, либо имеет возможность вызывать функции из внешних API.
У нас нет возможности описать все диалекты и нет желания описывать стандартный SQL. Поэтому мы остановимся на MS SQL Server.
Одна из самых сложных команд в Transact-SQL - команда CREATE TABLE имеет много опций и позволяет построить настоящую схему данных. Мы рассматривали эту команду в предыдущем разделе, но синтаксис этой команды в Transact-SQL требует более подробного ее рассмотрения в данном диалекте SQL.
Приводим синтаксис этой команды, а в табл. 8.2 описание ее аргументов.
CREATE TABLE [database.[owner].]tablename
({colname datatype [NULL | NOT NULL | IDENTITY[(seed, increment)]]
[constraint [ constraint [...constraint]]]
| [[,] constraint]} [[,] {nextcolname | nextconstraint}...])
[ON segmentname]
Таблица 8.2. Аргументы команды CREATE TABLE
Аргумент |
Назначение |
Database |
База данных, которая будет содержать таблицу. Если этот параметр опущен, то базой данных по умолчанию будет последняя, открытая с помощью команды USE. |
Owner |
Владелец новой таблицы, если не указан, то владельцем будет считаться текущий пользователь, который запускает команду. |
Tablename |
Имя вновь создаваемой таблицы. Должно удовлетворять правилам SQL для идентификаторов. |
Colname |
Название колонки в таблице. Должно удовлетворять правилам SQL для идентификаторов. |
Datatype |
Тип данных, поддерживаемый в SQL. Может быть как встроенным, так и пользовательским типом. |
Seed |
Начальное значение колонки типа IDENTITY. |
Increment |
Разница между последовательными значениями в колонке типа IDENTITY. |
Constraint |
Ограничения уровня поля или колонки. |
Пример использования команды:
CREATE TABLE modelSQL
(key_auto smallint IDENTITY(1,1),
model_name varchar(25) NOT NULL,
model_prc money)
В этом примере используются следующие опции команды CREATE TABLE: IDENTITY - указывает, что SQL Server автоматически прибавит единицу (аргумент Increment), причем отсчет начнется с 1 (Seed).
NOT NULL - указывает, что поле должно иметь значения в каждой новой записи. Это устанавливается по умолчанию. Если нужно разрешить полю не иметь значения, то в поле необходимо указать NULL.
Каждой колонке должен быть присвоен тип данных, которые она может хранить. В табл. 8.3 мы приведем типы данных, которые поддерживаются в MS SQL Server для колонок.
Таблица 3. Допустимые типы данных для MS SQL Server
Тип данных |
Описание |
bynary(n) |
Данные бинарного типа длиной ровно n бит. Не может принимать значения типа NULL. |
varbynary(n) |
Данные двоичного типа длиной до n бит. Может принимать значения типа NULL. |
char(n) |
Данные символьного типа длиной ровно n символов. Не может принимать значения типа NULL. |
varchar(n) |
Данные символьного типа длиной до n символов. Может принимать значения типа NULL. |
datetime |
Тип дата, который может принимать значения между 1 января 1753 и 31 декабря 9999 с точностью в 3.33 миллисекунд. |
small-datetime |
Тип дата, который может принимать значения между 1 января 1900 и 06 июня 2079 с точностью в 1 минуту. |
decimal(p,s) |
Десятичное число, которое может иметь всего до p знаков и до s знаков после запятой. Значение p должно быть не больше, чем 38, а s не больше, чем p. |
numeric(p,s) |
Десятичное число, которое может иметь всего до p знаков и до s знаков после запятой. Значение p должно быть не больше, чем 38, а s не больше, чем p. |
float(n) |
Число с плавающей запятой с количеством знаков после запятой не больше 15. Позволяет достигнуть точности 10 в 38 степени. |
real |
Число, которое может иметь до 7 знаков после запятой. |
int |
Целое число, принимающее значения между -2 147 483 648 и 2 147 483 647. |
smallint |
Целое число, принимающее значения между -32768 и 32767. |
tinyint |
Целое число, принимающее значения между 0 и 255. |
money |
Неокругленное число с плавающей запятой от -922 337 203 685 477.5808 до 922 337 203 685 477.5808. |
smallmoney |
Неокругленное число с плавающей запятой от -214 746.3648 до 214 746.3647. |
bit |
1 или 0. |
Timestamp |
Уникальное значение, которое генерирует SQL, каждый раз, когда запись редактируется. Каждая таблица может иметь только одно поле типа Timestamp. |
text |
Поле, принимающее значения символьного типа длиной до 2 Мб. |
image |
Поле двоичного типа длиной до 2 Мб. |
Помимо приведенного в табл.3 набора типов данных, можно создавать свои типы данных. Для этого используется системная хранимая процедура sp_addtype. В синтаксисе команды CREATE TABLE есть слово constraint (ограничение). Разрешено пять типов ограничений:
Первичный ключ (Primary Key) таблицы.
Уникальность (Unique) таблицы.
Ссылка (Foreign Key) таблицы.
Значение по умолчанию (Default) колонки.
Правило проверки уровня колонки (CHECK).
Чтобы создать первичный ключ, который следит за уникальностью значений по его выражению первичного ключа, включают ограничение первичного ключа. Главное же предназначение первичного ключа - это использование его в декларативной ссылочной целостности, с помощью которой вы можете проводить каскадные изменения данных (модификация, удаление и вставка) в дочерних таблицах, то есть таблицах, связанных с родительской по выражению первичного ключа. Синтаксис этого ограничения выглядит следующим образом:
[CONSTRAINT constraintname]
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(colname [, colname2 [..., colname16]])
[ON segmentname]
Первичный ключ может проиндексировать до 16 колонок в таблице. В таблице может быть только один первичный ключ. Первичный ключ может относиться к типу CLUSTERED или NONCLUSTERED. Тип CLUSTERED создает объект, в котором физический порядок записей такой же, как и индексный. Естественно, что это увеличивает скорость поиска записи. Только один индекс типа CLUSTERED может присутствовать в таблице. Обратите внимание, что ключевое слово CONSTRAINT опционное. Вы можете именовать ограничение, а можете не именовать. Если вы создадите ограничение с именем, то его имя будет появляться в системных сообщениях в случае, если будет предпринята попытка нарушить наложенное ограничение. Например:
CREATE TABLE Auto_Store.YourReadness.FirstTable
(sqlserverstns CONSTRAINT pk_SQL PRIMARY KEY CLUSTERED,
access_users)
или можно так:
CREATE TABLE Auto_Store.YourReadness.FirstTable
(sqlserverstns PRIMARY KEY CLUSTERED,
access_users)
Как уже указывалось, в таблице может быть только один первичный ключ, но с помощью ключевого слова UNIQUE можно подготовить кандидатов на первичный ключ и при необходимости с помощью команды ALTER TABLE переустановить первичный ключ. Для создания ключей-кандидатов используется следующий синтаксис:
[CONSTRAINT constraintname]
UNIQUE [CLUSTERED | NONCLUSTERED]
(colname [, colname2 [..., colname16]])
[ON segmentname]
Например:
CREATE TABLE Auto_Store.YourReadness.FirstTable
(sqlserverstns CONSTRAINT pk_SQL PRIMARY KEY CLUSTERED,
access_users CONSTRAINT uk_ac_users UNIQUE)
Учтите, что вы можете иметь только один индекс типа CLUSTERED, то есть в нашем случае второй индекс обязательно будет NONCLUSTERED. Следующее ограничение служит для построения ссылочной целостности, то есть для сохранения связей между двумя таблицами по выражению, которое мы укажем с помощью ключевого слова FOREIGN KEY. При этом те же поля должны быть указаны после ключевого слова REFERENCES, где также должна быть указана таблица, с которой организуется связь. Дополнительно необходимо, чтобы в родительской таблице обязательно присутствовал первичный или альтернативный ключ по тем же полям. Синтаксис этого ограничения:
[CONSTRAINT constraintname]
[FOREIGN KEY (colname [, colname2 [..., colname16]])]
REFERENCES [owner.]reftable [(refcol [, refcol2
[..., refcol16]])]
Исходя из вышесказанного, понятно, что в ключ ссылки (FOREIGN KEY) может входить не больше 16 полей. Надо отметить, что ссылки с помощью FOREIGN KEY и REFERENCES мы можем установить только для таблиц, которые находятся в одной базе данных. В следующем примере обратите внимание на изменение в записи ограничения при построения ключа по нескольким полям. Пример построения ссылочной целостности по одному полю:
CREATE TABLE autostore.yourreadness.pat_table
(tree char(20) PRIMARY KEY,
leaf char(10))
CREATE TABLE autostore.yourreadness.child_table
(wood char(20) REFERENCES pat_table(tree))
В данном примере нет необходимости указывать ключевое слово FOREIGN KEY, так как связь устанавливается по одному полю.
Пример построения ссылочной целостности по нескольким полям:
CREATE TABLE autostore.yourreadness.pat_table
(tree char(20),
branch money,
leaf char(10),
CONSTRAINT tochild PRIMARY KEY (tree,branch) )
CREATE TABLE autostore.yourreadness.child_table
(tree char(20),
branch money,
childs varchar(25),
FOREIGN KEY (tree,branch) REFERENCES pat_table(tree,branch)
Следует учитывать, что ключевое слово FOREIGN KEY не создает индекса. Поэтому для лучшей производительности имеет смысл создавать для дочерней таблицы индекс по выражению, которое будет использоваться в ссылке.
Ограничение Default устанавливает значение по умолчанию для колонки. Оно имеет следующий синтаксис:
[CONSTRAINT constraintname]
DEFAULT {constantexpression | niladic-function | NULL}
[FOR colname]
Здесь следует отметить, что можно использовать либо выражение в виде константы, либо функцию (встроенную или пользовательскую), которая не требует аргументов. Совершенно очевидно, что для колонки типа Timestamp значение по умолчанию устанавливать нельзя, так же как и для поля IDENTITY (счетчик). Если вы записываете данное ограничение как отдельное выражение, необходимо использовать ключевое слово FOR colname.
Рассмотрим пример использования ограничения Constraint. В данном примере создается таблица, колонка accept_date которой будет принимать значение текущей даты при добавлении новой записи в таблицу, - безусловно, только в том случае, если не будет указано явное значение.
CREATE TABLE autostore.yourreadness.child_table
(tree char(20),
branch money,
childs varchar(25),
accept_date datetime DEFAULT getdate()
FOREIGN KEY (tree,branch) REFERENCES pat_table(tree,branch)
Ограничение Check лимитирует список значений, которые мы можем ввести в колонку. Оно имеет следующий синтаксис:
[CONSTRAINT constraintname]
CHECK [NOT FOR REPLICATION] (expression)
В случае, если вы используете опцию NOT FOR REPLICATION, данное правило проверки уровня поля не будет срабатывать при операции репликации таблицы, в которой оно используется. Рассмотрим пример использования ограничения Check. В следующем примере параметр Check ограничивает ввод в колонке accept_date значениями, не превышающими дату следующего за текущим дня.
CREATE TABLE autostore.yourreadness.child_table
(tree char(20),
branch money,
childs varchar(25),
accept_date datetime CHECK accept_date << getdate()+1
FOREIGN KEY (tree,branch) REFERENCES pat_table(tree,branch)