Отдельного разговора требует рассмотрение именование. Дело в том, что 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 сервере, потому что мы будем использовать эту структуру в последующих главах для тестирования примеров.