Отдельного разговора требует рассмотрение именование. Дело в том, что SQL Server достаточно лояльно относиться к именам таблиц. Например, вы можете использовать в качестве имен русские слова, и даже имена из нескольких слов. Только если имя состоит из нескольких слов, оно должно заключаться в квадратные скобки. Посмотрим на следующий пример:
CREATE TABLE Товары ( [Дата] datetime, [Название товара] varchar(50), [Цена] money, [Количество] numeric(10, 2) )
В данном случае все имена объектов имеют русские названия. Я заключил все русские названия в квадратные скобки, чтобы их явно было видно. В реальных условиях, я рекомендую все же назвать все английскими названиями.
С помощью квадратных скобок можно создавать поля и из зарезервированных слов. Например, если попытаться создать таблице с именем поля min, то сервер вернет ошибку, потому что это зарезервированное имя (есть такой оператор). Но если имя поля из одного не зарегистрированного слова заключить в квадратные скобки, то ошибки не будет.
Квадратными скобками нужно выделять и имена полей из нескольких слов. Если в примере выше убрать квадратные скобки с имени поля "Название товара", то сценарий закончит выполнение ошибкой.
Давайте сведем всю рассмотренную в данной главе информацию и создадим базу данных из четырех таблиц:
В нашей базе данных два полноценных справочника для хранения должностей и для хранения типов телефонов. Справочники позволяют:
На рисунке 1.11 показано окно программы Enterprise Manager, которая входит в состав MS SQL Server и позволяет визуально работать с базой данных. Чтобы было удобно видеть структуру, я создал визуальную диаграмму и добавил в поля описания их предназначения.
Связь между таблицами персонала (tbPeoples) и должностями (tbPosition) происходит по схеме один ко многим. Одной строке из таблицы таблицы должностей соответствует множество строк из tbPeoples. Связь между персоналом и телефонами (tbPhoneNumbers) происходит по схеме один ко многим. Одной записи из таблицы персонала может соответствовать несколько номеров телефонов. Между номерами телефонов и их типами снова связь один ко многим – одному типу телефона соответствует много номеров.
В листинге 1.11 показан код создания этой базы данных. Внимательно изучите его, потому что он резюмирует все, что мы рассматривали в этой главе. Текст, который находиться после символов -- (два тире) является комментарием и не выполняется программой, а используется только для того, чтобы вам проще было разобраться с выполняемыми действиями.
Листинг 1.11. Создание базы тестовой данных
-- Удаляем базу данных
DROP DATABASE FlenovSQLBook
GO
-- Создаем базу данных
CREATE DATABASE FlenovSQLBook
GO
-- Переходим в базу данных телефонов
USE FlenovSQLBook
-- Создаем таблицу должностей
CREATE TABLE tbPosition
(
-- Описание полей
idPosition int IDENTITY(1,1),
idParentPosition int,
vcPositionName varchar(30),
-- Описание ограничений
CONSTRAINT PK_idPosition PRIMARY KEY (idPosition),
CONSTRAINT FK_idParentPosition FOREIGN KEY (idParentPosition)
REFERENCES tbPosition (idPosition)
)
-- Создаем таблицу работников
CREATE TABLE tbPeoples
(
-- Описание полей
idPeoples int IDENTITY(1, 1),
vcFamil varchar(50),
vcName varchar(50),
vcSurname varchar(50),
idPosition int,
dDateBirthDay datetime,
-- Описание ключей
CONSTRAINT PK_idPeoples PRIMARY KEY (idPeoples),
CONSTRAINT FK_idPosition FOREIGN KEY (idPosition)
REFERENCES tbPosition (idPosition),
-- Описание ограничений
CONSTRAINT check_dDateBirthDay CHECK (dDateBirthDay<getdate())
)
-- Создаем таблицу типов телефонов
CREATE TABLE tbPhoneType
(
idPhoneType int IDENTITY(1, 1),
vcTypeName varchar(20),
-- Описание ограничений
CONSTRAINT PK_idPhoneType PRIMARY KEY (idPhoneType),
)
-- Создаем таблицу телефонов
CREATE TABLE tbPhoneNumbers
(
-- Описание полей
idPhoneNumbers int IDENTITY(1, 1),
idPhoneType int,
idPeoples int,
vcPhoneNumber varchar(15),
-- Описание ключей
CONSTRAINT PK_idPhoneNumbers PRIMARY KEY (idPhoneNumbers),
CONSTRAINT FK_idPhoneType FOREIGN KEY (idPhoneType)
REFERENCES tbPhoneType (idPhoneType),
CONSTRAINT FK_idPeoples FOREIGN KEY (idPeoples)
REFERENCES tbPeoples (idPeoples),
-- Описание ограничений
CONSTRAINT check_vcPhonenumber CHECK (vcPhonenumber LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]')
)
Помимо этого, создадим еще и таблицу с русскими именами, которая не связана с предыдущими таблицами:
CREATE TABLE Товары ( [Дата] datetime, [Название товара] varchar(50), [Цена] money, [Количество] numeric(10, 2) )
Эта таблица проста, но пригодиться в будущем при тестировании некоторых операторов, особенно во второй главе.
Обязательно создайте эту базу данных на своем SQL сервере, потому что мы будем использовать эту структуру в последующих главах для тестирования примеров.