
- •Тема 1) Введение в sql
- •Операторы ddl (Data Definition Language) - операторы определения объектов базы данных
- •Операторы dml (Data Manipulation Language) - операторы манипулирования данными
- •Операторы защиты и управления данными
- •К операторам определения объектов базы данных можно отнести следующие операторы…
- •2.2) Создание/уничтожение таблиц базы данных
- •2.3) Создание (удаление) индексов
- •Тема 3) Определение ограничений для таблиц бд
- •Тема 4) Действие ограничений целостности
- •Тема 5) Выборка данных (предложение select)
- •Тема 8) Выборка с упорядочением и агрегированием данных
- •Тема 8) Запросы с использованием нескольких таблиц
- •Тема 9) Реализация операций реляционной алгебры предложением select
- •Тема 10) Создание представлений
- •Тема 11) Предложения модификации данных
- •Тема 12) Безопасность и санкционирование доступа
- •Тема 13) Обработка транзакций
2.3) Создание (удаление) индексов
Для построения индекса в SQL существует предложение CREATE INDEX(создать индекс).
Индекс - это системная таблица, построенная по значениям заданного столбца заданной таблицы. В нем размещается перечень уникальных значений указанного столбца таблицы со ссылками на те ее строки, где встречаются эти значения (структура, похожая на предметный указатель книги). Например, в БД существует таблица НАЧИСЛЕНИЯ, в которой хранятся сведения о заработной плате сотрудников предприятия
-
ФИО сотрудника
Месяц
Сумма
Иванов
1
10000
Петров
1
12000
Сидоров
1
10000
Иванов
2
10000
Сидоров
2
10000
Иванов
3
10000
Петров
3
12000
Индекс, построенный для столбца ФИО сотрудника таблицы НАЧИСЛЕНИЯ будет содержать следующие сведения:
Значения столбца |
Строки, в которых встречается такое значение | ||
Иванов |
1 |
4 |
6 |
Петров |
2 |
7 |
|
Сидоров |
3 |
5 |
|
Синтаксис предложения CREATE INDEX (создать индекс
CREATE [UNIQUE][CLUSTERED|NONCLUSTERED]INDEX имя_индекса
ON [база_данных.]базовая_таблица(имя_столбца[[ASC] | DESC] [,имя_столбца [[ASC] | DESC]]]...)
[WITH]
[FILLFACTOR = x]
[ON имя_сегмента]
Создает индекс для перечисленных колонок на указанном сегменте.
CLUSTERED- кластеризованный индекс, т.е. такой индекс, при котором в листьях B-дерева, образующего индекс, находятся не ссылки на данные, а собственно страницы данных.
FILLFACTOR- позволяет управлять заполнением страниц B-дерева индекса, задается в процентах, 100% - полное заполнение.
UNIQUE (уникальный) указывает, что никаким двум строкам в индексируемой базовой таблице не позволяется принимать одно и то же значение для индексируемого столбца (или комбинации столбцов) в одно и то же время.
Например, индексы для столбцов БЛ и Основа таблицы Блюда создаются с помощью предложений
CREATE UNIQUE INDEX Блюда_БЛ ON Блюда (БЛ);
CREATE INDEX Блюда_Основа ON Блюда (Основа);
а индекс для первичного ключа (столбцы БЛ и ПР) таблицы Состав - с помощью предложения
CREATE UNIQUE INDEX Состав_БЛ_ПР ON Состав (БЛ, ПР);
Уничтожить индексы, построенные по столбцам таблицы можно с помощью предложения DROP INDEX (уничтожить индекс), имеющего следующий формат:
DROP INDEX имя_индекса;
Например, .
DROPINDEXБлюда_Основа
Задание к теме 2:
Написать скрипт на создание базы данных, согласно индивидуального варианта задания
Написать скрипты на создание таблиц базы данных согласно индивидуального варианта задания.
Тема 3) Определение ограничений для таблиц бд
Ограничения - это часть определений таблицы, которое ограничивает значения, которые можно вводить в столбцы. Когда вы создаете таблицу (или, когда вы ее изменяете), вы можете помещать ограничения на значения, которые могут быть введены в поля.
Имеется два основных типа ограничений - ограничение столбца и ограничение таблицы. Различие между ними в том, что ограничение столбца применяется только к индивидуальным столбцам, в то время как ограничение таблицы применяется к группам из одного и более столбцов.
Ограничение столбца записывается в предложении CREATE TABLE после имени столбца и типа данных, перед запятой. Ограничение таблицы помещаются в конец имени таблицы после последнего имени столбца, но перед заключительной круглой скобкой.
Вы можете использовать команду CREATE TABLE чтобы предохранить поле от разрешения в нем пустых (NULL) указателей с помощью ограничения NOT NULL.Это ограничение накладывается только для столбцов. NULL-значение "придумано" для того, чтобы представить единым образом "неизвестные значения" для любых типов данных. NULL - это специальное обозначение которое отмечает поле как пустое, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное - в другом.
Давайте улучшим определение таблицы Сотрудники, не позволяя помещать NULL значения в столбцы Код, ФИО, Адрес, Дата рождения:
CREATE TABLE Сотрудники
(Код SMALLINT NOT NULL,
ФИО CHAR (70) NOT NULL,
Адрес CHAR (15) NOT NULL,
Телефон CHAR (10),
Город CHAR (10),
Дата рождения DATE NOT NULL,
РНН CHAR (10) NOT NULL);
Когда вы вставляете строку в таблицу без указания значений в ней для каждого поля, SQL должен иметь значение по умолчанию для включения его в определенное поле, или же команда будет отклонена. Значение DEFAULT(ПО УМОЛЧАНИЮ) указывается в команде CREATE TABLE тем же способом что и ограничение столбца, хотя, с технической точки зрения, значение DEFAULT не ограничительного свойства - оно не ограничивает значения которые вы можете вводить, а просто определяет, что может случиться если вы не введете любое из них. Предположим что подавляющее большинство сотрудников вашего предприятия родились в г. Караганде. Вы можете указать «Караганда» в качестве значения поля город, по умолчанию, для вашей таблицы Сотрудники:
CREATE TABLE Сотрудники
(Код SMALLINT NOT NULL PRIMARY KEY,
ФИО CHAR (70) NOT NULL,
Адрес CHAR (15) NOT NULL,
Телефон CHAR (10),
Город CHAR (10) DEFAULT = 'Караганда',
Дата рождения DATE NOT NULL,
РНН CHAR (10) NOT NULL UNIQUE);
В этом случае вводить значение Караганда в столбец город таблицы каждый раз когда принимается на работу новый сотрудник необязательно, можно просто пренебречь им (не вводя его) если оно должно иметь значение «Караганда».
Ограничение CHECKпозволяет установить условие, которому должно удовлетворять значение, вводимое в таблицу, прежде чем оно будет принято. Ограничение CHECK состоит из ключевого слова CHECK сопровождаемого предложением предиката, который использует указанное поле. Любая попытка модифицировать или вставить значение поля которое могло бы сделать этот предикат неверным - будет отклонена.
Создадим таблицу Заказчиков таким способом, чтобы вводимые значения для Код_заказчика и Код_продавца ограничивались бы целыми положительными цифрами:
CREATE TABLE Заказчики
( Код_заказчика integer CHECK (Код_заказчика >=0),
Наименование_заказчика char (10) NOT NULL,
Город char (10),
Код_продавца integer CHECK (Код_продавца >=0));
Можно также использовать CHECK в качестве табличного ограничения. Это полезно в тех случаях когда вы хотите включить более одного поля строки в условие. Предположим что комиссионные Код заказчика 1 и выше, будут разрешены только для продавца из Караганды. Это можно указать со следующим табличным ограничением CHECK :
CREATE TABLE Заказчики
(Код_заказчика integer NOT NULL UNIQUE,
Наименование_заказчика char (10) NOT NULL,
город char(10),
Код_продавца integer NOT NULL UNIQUE,
CHECK (Код_заказчика > 1 OR город = 'Караганда'));
Время от времени, вы хотите убедиться, что все значения, введенные в столбец, отличаются друг от друга. Если вы помещаете ограничение столбца UNIQUEв поле при создании таблицы, база данных отклонит любую попытку ввода в это поле для одной из строк, значения, которое уже представлено в другой строке. Это ограничение может применяться только к полям которые были объявлены как непустые (NOT NULL).
Давайте улучшим определение таблицы Сотрудники:
CREATE TABLE Сотрудники
(Код SMALLINT NOT NULL,
ФИО CHAR (70) NOT NULL,
Адрес CHAR (15) NOT NULL,
Телефон CHAR (10),
Город CHAR (10),
Дата рождения DATE NOT NULL,
РНН CHAR (10) NOT NULL UNIQUE);
Столбцы (не первичные ключи) чьи значения требуют уникальности, называются ключами-кандидатами или уникальными ключами.
Вы можете также определить группу полей как уникальную с помощью команды ограничения таблицы UNIQUE. Объявление группы полей уникальной, отличается от объявления уникальными индивидуальных полей, так как это комбинация значений, а не просто индивидуальное значение, которое обязано быть уникальным. Уникальность группы - это представление порядка, так что бы пары строк со значениями столбцов "a", "b" и "b", "a" рассматривались отдельно одна от другой. Например, база данных должна быть спроектирована так, чтобы каждый заказчик был назначен одному и только одному продавцу. Это означает что каждая комбинация номера заказчика (Код заказчика) и номера продавца (Код продавца) в таблице Заказчиков должна быть уникальной. Создадим таблицу Заказчиков таким способом:
CREATE TABLE Заказчики
( Код_заказчика integer NOT NULL,
Наименование_заказчика char (10) NOT NULL,
Город char (10),
Код_продавца integer NOT NULL,
UNIQUE (Код_заказчика, Код_продавца));
Обратите внимание что оба поля в ограничении таблицы UNIQUE используют ограничение столбца - NOT NULL. Если бы мы использовали ограничение столбца UNIQUE для поля Код_заказчика, такое ограничение таблицы было бы необязательным. Если значения поля Код_заказчика различно для каждой строки, то не может быть двух строк с идентичной комбинацией значений полей Код_заказчика и Код_продавца. То же самое получится если мы объявим поле Код_продавца уникальным, хотя это и не будет соответствовать нашему примеру, так как продавец будет назначен многочисленным заказчикам. Следовательно, ограничение таблицы - UNIQUE, наиболее полезно когда вы не хотите заставлять индивидуальные поля быть уникальными.
В настоящее время большинство SQL поддерживает первичные ключи непосредственно с ограничением Первичный Ключ(PRIMARE KEY). PRIMARY KEY может ограничивать таблицы или их столбцы. Это ограничение работает так же как и ограничение UNIQUE, за исключением того, что для таблицы может быть определена только один первичный ключ (хотя и для любого числа столбцов) может быть определен для данной таблицы. Первичные ключи не могут позволить значений NULL. Это означает что, любое поле используемое в ограничении PRIMARY KEY должно уже быть объявлено NOT NULL.
Давайте улучшим определение таблицы Сотрудники:
CREATE TABLE Сотрудники
(Код SMALLINT NOT NULL PRIMARY KEY,
ФИО CHAR (70) NOT NULL,
Адрес CHAR (15) NOT NULL,
Телефон CHAR (10),
Город CHAR (10),
Дата рождения DATE NOT NULL,
РНН CHAR (10) NOT NULL UNIQUE);
Ограничение PRIMARY KEY может быть применено для многочисленных полей, составляющих уникальную комбинацию значений. Предположим что ваш первичный ключ - это ФИО, а вы храните фамилию, имя и отчество в трех различных полях. Очевидно, что ни одно из них нельзя заставить быть уникальным самостоятельно, но мы можем каждую из этих трех комбинаций сделать уникальной. Например,:
CREATE TABLE Список
(фамилия char (10) NOT NULL,
имя char (10) NOT NULL,
отчество char (10) NOT NULL,
город char (10),
PRIMARY KEY (фамилия, имя, отчество ));
Ограничение FOREIGN KEYв команде CREATE TABLE (или ALTER TABLE ), используется, если определяемая таблица содержит поле которое вы хотите объявить внешним ключом.
Когда какое-то поле таблицы называют внешним ключом, оно определенным образом связано с таблицей на которую он ссылается. Вы, фактически, подразумеваете, что каждое значение в этом поле (внешнем ключе) непосредственно привязано к значению в другом поле (родительском ключе). Каждое значение во внешнем ключе должно быть представлено один, и только один раз, в родительском ключе.
Подобно большинству ограничений, оно может быть ограничением таблицы или столбца.
Синтаксис ограничения таблицы FOREIGN KEY:
FOREIGN KEY <список стобцов> REFERENCES
<PKTABLE> [ <список столбцов> ]
Первый список столбцов - это список из одного или более столбцов создаваемой таблицы, которые разделены запятыми. Pktable - это имя таблицы, содержащей родительский ключ. Она может быть таблицей, которая создается или изменяется текущей командой. Второй список столбцов - это список столбцов которые будут составлять родительский ключ. Списки двух столбцов должны быть совместимы, т.е.:
должны иметь одинаковое число столбцов,
должны иметь одинаковые типы данных и размеры.
Создадим таблицу Телефонный_справочник с полем Код_улицы определенным в качестве внешнего ключа ссылающегося на таблицу Справочник_улиц:
CREATE TABLE Телефонный справочник
( Номер_телефона integer NOT NULL PRIMARY KEY
ФИО char(20),
Код_улицы integer,
FOREIGN KEY (Код_улицы) REFERENCES Справочник_улиц (Код));
Вариант ограничения столбца ограничением FOREIGN KEY - по другому называется - ссылочное ограничение (REFERENCES), так как он фактически не содержит в себе слов FOREIGN KEY, а просто использует слово REFERENCES, и далее им родительского ключа, подобно этому:
CREATE TABLE Телефонный_справочник
( Номер_телефона integer NOT NULL PRIMARY KEY
ФИО char(20),
Код_улицы integer REFERENCES Справочник_улиц (Код));
Вышеупомянутое определяет Телефонный_справочник.Код_улицы как внешний ключ у которого родительский ключ - это Справочник_улиц.Код. Это эквивалентно такому ограничению таблицы: FOREIGNKEY(Код_улицы)REFERENCESСправочник_улиц (Код).
Задание к теме 3:
1. Усовершенстовать скрипты на создание таблиц базы данных согласно индивидуального варианта задания. При определении таблиц в их описание включить (при необходимости) ограничения not null, default, check.
2. Усовершенстовать скрипты на создание таблиц базы данных согласно индивидуального варианта задания. При определении таблиц в их описание включить (при необходимости) ограничения primarykey,unique,foreingkey. Для атрибутов типаuniqueсоздать индексы.