Published on

October 11, 2020

Создание таблиц и отношений в SQL Server

Большинство приложений полагаются на базы данных для хранения и управления данными. В этом учебнике по SQL мы рассмотрим процесс создания таблиц и установления отношений между ними в Microsoft SQL Server. Следуя этим шагам, вы получите лучшее понимание того, как настроить таблицы и определить их отношения в своих собственных приложениях баз данных.

Создание тестовой базы данных SQL Server

Прежде чем мы сможем начать создавать таблицы, нам нужно создать новую базу данных для их хранения. В SQL Server Management Studio (SSMS) вы можете использовать следующий синтаксис для создания базы данных:

-- Создание HRDatabase
USE master
GO

-- Команда удаления базы данных
DROP DATABASE IF EXISTS HRDatabase
GO

-- Команда создания базы данных SQL с файлами и свойствами по умолчанию
CREATE DATABASE HRDatabase
GO

-- Использование текущей базы данных
USE HRDatabase -- Имя базы данных
GO

Создание основных таблиц

Затем мы создадим две основные таблицы для нашей базы данных HR: Companies и Employees. В этих таблицах будет храниться информация о компаниях и их сотрудниках. Вот SQL-код для создания этих таблиц:

-- Создание двух основных таблиц Companies и Employees
DROP TABLE IF EXISTS Companies;
DROP TABLE IF EXISTS Employees;

CREATE TABLE Companies (
   id             INT CONSTRAINT PK_Companies PRIMARY KEY IDENTITY,
   CompanyName    VARCHAR(80) NOT NULL,
   CompAddress    VARCHAR(80) NOT NULL,
   CompContactNo  VARCHAR(20) NOT NULL,
   IsActive       BIT CONSTRAINT DF_IsActive_Companies DEFAULT(1),
   CreateDate     DATETIME NOT NULL DEFAULT getdate()
);

CREATE TABLE Employees (
   id             INT CONSTRAINT PK_Employees PRIMARY KEY IDENTITY,
   EmployeeName   VARCHAR(80) NOT NULL,
   ContactNo      VARCHAR(20) NOT NULL,
   Email          VARCHAR(80) NOT NULL,
   CompID         INT NOT NULL,
   AddressID      INT NOT NULL,
   TitleID        INT NOT NULL,
   GenderID       INT NOT NULL,
   IsActive       BIT CONSTRAINT DF_IsActive_Employees DEFAULT(1),
   CreateDate     DATETIME NOT NULL DEFAULT getdate()
);

Создание вспомогательных таблиц

Помимо основных таблиц, нам также необходимо создать вспомогательные таблицы, которые будут использоваться в нашем приложении. Эти таблицы включают Title, Gender, LeaveTypes и Addresses. Вот SQL-код для создания этих таблиц:

-- Создание вспомогательных таблиц
DROP TABLE IF EXISTS Title;
DROP TABLE IF EXISTS Gender;
DROP TABLE IF EXISTS LeaveTypes;
DROP TABLE IF EXISTS Leave;
DROP TABLE IF EXISTS Addresses;

CREATE TABLE Title (
   id          INT CONSTRAINT PK_Title PRIMARY KEY IDENTITY,
   Title       VARCHAR(80) NOT NULL,
   TitleDescr  VARCHAR(80) NOT NULL,
   CreateDate  DATETIME NOT NULL DEFAULT getdate()
);

CREATE TABLE Gender (
   id          INT CONSTRAINT PK_Gender PRIMARY KEY IDENTITY,
   Gender      VARCHAR(80) NOT NULL,
   GenderDescr VARCHAR(80) NOT NULL,
   CreateDate  DATETIME NOT NULL DEFAULT getdate()
);

CREATE TABLE LeaveTypes (
   id          INT CONSTRAINT PK_LeaveTypes PRIMARY KEY IDENTITY,
   LeaveType   VARCHAR(80) NOT NULL,
   LeaveDescr  VARCHAR(80) NOT NULL,
   CreateDate  DATETIME NOT NULL DEFAULT getdate()
);

CREATE TABLE Addresses (
   id          INT CONSTRAINT PK_Addresses PRIMARY KEY IDENTITY,
   Address     VARCHAR(256) NOT NULL,
   CreateDate  DATETIME NOT NULL DEFAULT getdate()
);

CREATE TABLE Leave (
   id          INT CONSTRAINT PK_Leave PRIMARY KEY IDENTITY,
   LeaveTypeID INT NOT NULL,
   StartDate   DATE NOT NULL,
   EndDate     DATE NOT NULL,
   LeaveNotes  VARCHAR(800) NOT NULL,
   EmpID       INT NOT NULL,
   CreateDate  DATETIME NOT NULL DEFAULT getdate()
);

Добавление внешних ключей для создания отношений

Для установления отношений между таблицами нам нужно добавить внешние ключи. Внешний ключ – это столбец в одной таблице, который ссылается на первичный ключ в другой таблице. Добавляя внешние ключи, мы обеспечиваем ссылочную целостность между таблицами. Вот SQL-код для добавления внешних ключей:

-- Добавление внешних ключей, создающих связи между соответствующими таблицами
ALTER TABLE dbo.Employees ADD CONSTRAINT FK_Employees_Companies
  FOREIGN KEY(CompID) REFERENCES Companies(id) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE dbo.Employees ADD CONSTRAINT FK_Employees_Addresses
  FOREIGN KEY(AddressID) REFERENCES Addresses(id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE dbo.Employees ADD CONSTRAINT FK_Employees_Titles
  FOREIGN KEY(TitleID) REFERENCES Title(id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE dbo.Employees ADD CONSTRAINT FK_Employees_Genders
  FOREIGN KEY(GenderID) REFERENCES Gender(id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE dbo.Leave ADD CONSTRAINT FK_Leave_Employees 
  FOREIGN KEY(EmpID) REFERENCES Employees(id) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE dbo.Leave ADD CONSTRAINT FK_Leave_LeaveTypes
  FOREIGN KEY(LeaveTypeID)REFERENCES LeaveTypes(id) ON DELETE NO ACTION ON UPDATE NO ACTION;

Вставка образцовых данных

Теперь, когда наши таблицы и отношения настроены, мы можем вставить образцовые данные в таблицы. Это позволит нам протестировать наши запросы и увидеть, как данные связаны. Вот SQL-код для вставки образцовых данных:

-- Вставка компаний
INSERT INTO Companies (CompanyName, CompAddress, CompContactNo) 
VALUES
  ('Alpha Company', '123 North Street, Garsfontein, Pretoria', '091 523 6987' ),
  ('Bravo Company', '456 South Street, Brooklyn, Pretoria', '091 523 4789' ),
  ('Charlie Company', '987 West Street, Lynnwood, Pretoria', '091 523 1235' ),
  ('Delta Company', '258 East Street, The Meadows, Pretoria', '091 523 7414' ),
  ('Echo Company', '100 Amber Street, Hatfield, Pretoria', '091 523 9685' )

-- Вставка должностей
INSERT INTO Title (Title, TitleDescr) 
VALUES
  ('Mr', 'Мистер'),
  ('Mrs', 'Миссис'),
  ('Miss', 'Мисс')

-- Вставка пола
INSERT INTO Gender (Gender, GenderDescr) 
VALUES 
  ('Мужской' , 'Мужской'),
  ('Женский' , 'Женский')

-- Вставка типов отпусков
INSERT INTO LeaveTypes (LeaveType, LeaveDescr) 
VALUES
  ('Годовой', 'Годовой отпуск'),
  ('Учебный', 'Учебный отпуск'),
  ('Больничный', 'Больничный отпуск'),
  ('Неоплачиваемый', 'Неоплачиваемый отпуск')

-- Вставка адресов
INSERT INTO Addresses (Address) 
VALUES
  ('123 North Street, Garsfontein, Pretoria') ,
  ('456 South Street, Brooklyn, Pretoria'),
  ('987 West Street, Lynnwood, Pretoria'),
  ('258 East Street, The Meadows, Pretoria'),
  ('100 Amber Street, Hatfield, Pretoria')

-- Вставка сотрудников
INSERT INTO Employees (EmployeeName, ContactNo, Email, CompID, AddressID, TitleID, GenderID) 
VALUES
  ('Джо Блогс', '012 365 4789', 'joe@example.com', 1 ,1, 1, 1) ,
  ('Джейн Доу', '012 365 4789', 'jane@example.com', 2 ,1, 2, 1) ,
  ('Джон Смит', '012 365 4789', 'john@example.com', 1 ,1, 1, 1) ,
  ('Эдди Джонс', '012 365 4789', 'eddy@example.com', 4 ,1, 1, 1) ,
  ('Мэри Поппинс', '012 365 4789', 'mary@example.com', 5 ,1, 3, 1)

Запрос данных

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

SELECT  c.CompanyName      
      , e.EmployeeName
      , a.Address
      , lt.LeaveType
      , t.Title
      , g.Gender
      , l.StartDate, l.EndDate
      , DATEDIFF(day, l.StartDate, l.EndDate)+1 'Leave Days'
FROM dbo.Companies c 
JOIN dbo.Employees e on e.CompID = c.id
JOIN dbo.Addresses a on a.id = e.AddressID
JOIN dbo.Title t on t.id = e.TitleID
JOIN dbo.Gender g on g.id = e.GenderID
JOIN dbo.Leave l on l.EmpID = e.id
JOIN dbo.LeaveTypes lt on lt.id = l.LeaveTypeID

Этот запрос вернет информацию о Джейн Доу, включая ее компанию, адрес, тип отпуска, должность, пол, даты начала и окончания отпуска, а также количество дней отпуска.

Очистка

Наконец, когда вы закончите работу с базой данных, вы можете очистить ее, удалив HRDatabase. Обратите внимание, что это не следует делать в рабочей среде. Вот SQL-код для удаления базы данных:

USE master;
GO

-- Удаление базы данных, если она существует
DROP DATABASE IF EXISTS HRDatabase;
GO

Следуя этим шагам, вы можете создавать таблицы, устанавливать отношения, вставлять данные и запрашивать данные в вашей базе данных SQL Server. Это поможет вам создавать надежные и эффективные приложения баз данных.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.