Вы находитесь на странице: 1из 19

Правительство Российской Федерации

Федеральное государственное автономное образовательное учреждение


высшего профессионального образования

«Национальный исследовательский университет


«Высшая школа экономики»

Факультет бизнеса и менеджмента, направление «Бизнес-информатика»

РЕФЕРАТ

На тему: «Построение базы данных для мониторинга деятельности публичной


библиотеки»

Студент группы № 163


Гильманова Венера Миневагизовна

Преподаватель
Поляков Игорь Викторович,
кандидат физико-математических наук.

Москва, 2018 год


Содержание
 Описание предметной области
 Описание связей между сущностями
 Схемы баз данных в ER-Win, Workbench
 Описание ограничений целостности
 Описание базы данных на языке SQL
 Триггеры
 Создание БД на основании SQL описания в MySQL и в MS SQL Server
 Запросы
 Хранение запросов
 Веб сайт
Описание предметной области

База данных для публичной библиотеки создается для облегчения хранения,


поиска и ввода данных о деятельности самого учреждения. Модель включает в
себя данные о посетителях библиотеки, работниках и книгах. Однако, сущностей в
модели намного больше. Кроме сущностей «посетитель» и «работник», также
присутствуют «штраф», «книга», «поставщик», «автор», «жанр», «публицист» и,
конечно же, «пропуск».
Данная модель систематизирует работу библиотеки, так как в ней
содержатся все данные по книгам, система выдачи штрафа за просрочку книги,
данные о посетителях и их пропуски, и данные о работниках.

Название Имя сущности Атрибуты


Работники Staff Имя, фамилия, отчество,
зарплата, день начала
работы, день окончания
работы (опционально), дата
рождения,
Посетители Reader Имя, фамилия, отчество,
день вступления, номер оф.
документа,
Пропуск Library_Pass Срок действия, дата
выдачи, дата завершения
Книга Book Название
«Книга на руках» Book_OnHand Дата выдачи, дата возврата,
дата реального
возврата(опционально)
Публицист Publisher Название
Жанр Genre Название
Поставщик Provider Название, телефон,
местонахождение, тип
продающих книг
Автор Author Имя
Штраф Fee Цена, тип штрафа

Описание связей между сущностями

Читатель имеет один пропуск (связь один ко одному), также читатель может
взять много книг на руки (связь один ко многим). Библиотекарь может выдать
много книг на руки (связь один ко многим). Книга имеет авторов (один ко многим),
жанр (один ко многим), публициста (один ко многим), поставщика (многие ко
многим). Также книга связана с «книгой на руках» (связь один ко многим). Штраф
может быть за многие книги и за множество вещей (разные типы штрафов)
поэтому связь с «книгами на руках» многие ко многим.
Сущность Связана с - Связь
Staff Book_OnHand 1: n
Reader Library_Pass 1:1
Reader Book_OnHand 1: n
Book Provider n:m
Book Book_OnHand 1: n
Publisher Book 1: n
Author Book 1: n
Genre Book 1: n
Book_OnHand Fee n:m

Схемы баз данных


Workbench:

ER-Win:
Описание ограничений целостности

Ограничения целостности модели:


1. Пропуск не может длиться больше 365 дней.
2. Зарплата работников не может быть ниже 12000 рублей
3. Сумма одного штрафа не может превышать 1000 рублей.
4. День возврата книги меняется на день назначенного возврата если читатель
возвращает его раньше.
5. Когда в таблицу добавляется новый штраф, всем сотрудникам добавляется 1000
рублей к зарплате.

Ограничение уровня базы данных:


Primary Key: Staff.IDstaff, Reader.IDreader, Book.IDbook, Publisher.IDpublisher,
Author.ID_author, Genre.ID_genre, Provider.IDprovider, Library_Pass.Idlibrary_pass,
Book_OnHand.ID, Fee.ID_Fee
Ограничения Primary Key целостны и уникальны. Все они NOT NULL.
Foreign Key: Staff.Book_OnHand_ID, Reader.Book_OnHand_ID, Book.
Book_OnHand_ID, Book.Publisher_IDpublisher, Book.Author_ID_Author,
Book.Genre_ID_Genre, Library_Pass.Reader_IDreader, Book_Has_Provider.Book_IDbook,
Book_Has_Provider.Provider_IDprovider, Book_OnHand_Has_Fee.Book_OnHand_ID,
Book_OnHand_Has_Fee.Fee_ID_Fee
Ограничения Foreign Key обеспечивают необходимую связь между таблицами.
Ограничение атрибута:
CHECK (Staff.Staff_Salary>=12000)

Описание базы данных на языке SQL


Для MySQL Server Management Studio
go
CREATE Database PB;
go
USE PB ;

CREATE TABLE Book_OnHand (


Book_exportDay DATETIME NOT NULL ,
Book_returnDay DATETIME NOT NULL ,
Book_ActualDayreturn DATETIME NULL ,
ID INT NOT NULL ,
PRIMARY KEY (ID) )
;

CREATE TABLE Staff (


IDstaff INT NOT NULL ,
Staff_Name VARCHAR(25) NOT NULL ,
Staff_Surname VARCHAR(25) NOT NULL ,
Staff_MiddleName VARCHAR(25) NULL ,
Staff_Salary INT NOT NULL ,
Staff_FirstDay DATE NOT NULL ,
Staff_LastDay DATE NULL ,
Staff_BirthDay DATE NOT NULL ,
Book_OnHand_ID INT NOT NULL ,
PRIMARY KEY (IDstaff) ,
CONSTRAINT fk_Staff_Book_OnHand1
FOREIGN KEY (Book_OnHand_ID)
REFERENCES Book_OnHand (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

CREATE TABLE Reader (


IDreader INT NOT NULL ,
Reader_Name VARCHAR(25) NOT NULL ,
Reader_Surname VARCHAR(25) NOT NULL ,
Reader_MiddleName VARCHAR(25) NULL ,
Reader_JoinDay DATE NOT NULL ,
Reader_OfDocumentNumber INT NOT NULL ,
Book_OnHand_ID INT NOT NULL ,
PRIMARY KEY (IDreader) ,
CONSTRAINT fk_Reader_Book_OnHand1
FOREIGN KEY (Book_OnHand_ID)
REFERENCES Book_OnHand (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

CREATE TABLE Publisher (


IDpublisher INT NOT NULL ,
Publisher_Name VARCHAR(25) NOT NULL ,
PRIMARY KEY (IDpublisher) )
;

CREATE TABLE Author (


ID_Author INT NOT NULL ,
Author_Name VARCHAR(25) NOT NULL ,
PRIMARY KEY (ID_Author) )
;

CREATE TABLE Genre (


ID_Genre INT NOT NULL ,
Genre_Name VARCHAR(25) NOT NULL ,
PRIMARY KEY (ID_Genre) )
;

CREATE TABLE Book (


IDbook INT NOT NULL ,
Book_Name VARCHAR(25) NOT NULL ,
Book_OnHand_ID INT NOT NULL ,
Publisher_IDpublisher INT NOT NULL ,
Author_ID_Author INT NOT NULL ,
Genre_ID_Genre INT NOT NULL ,
PRIMARY KEY (IDbook) ,
CONSTRAINT fk_Book_Book_OnHand1
FOREIGN KEY (Book_OnHand_ID)
REFERENCES Book_OnHand (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Publisher1
FOREIGN KEY (Publisher_IDpublisher)
REFERENCES Publisher (IDpublisher)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Author1
FOREIGN KEY (Author_ID_Author)
REFERENCES Author (ID_Author)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Genre1
FOREIGN KEY (Genre_ID_Genre)
REFERENCES Genre (ID_Genre)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

CREATE TABLE Provider (


IDprovider INT NOT NULL ,
Provider_Name VARCHAR(25) NOT NULL ,
Provider_Phone INT NOT NULL ,
Provider_Location VARCHAR(25) NOT NULL ,
Provider_Type VARCHAR(25) NOT NULL ,
PRIMARY KEY (IDprovider) )
;

CREATE TABLE Book_has_Provider (


Book_IDbook INT NOT NULL ,
Provider_IDprovider INT NOT NULL ,
PRIMARY KEY (Book_IDbook, Provider_IDprovider) ,
CONSTRAINT fk_Book_has_Provider_Book1
FOREIGN KEY (Book_IDbook)
REFERENCES Book (IDbook)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_has_Provider_Provider1
FOREIGN KEY (Provider_IDprovider)
REFERENCES Provider (IDprovider)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

CREATE TABLE Fee (


ID_Fee INT NOT NULL ,
Fee_Type VARCHAR(45) NOT NULL ,
Fee_price VARCHAR(45) NOT NULL ,
PRIMARY KEY (ID_Fee) )
;

CREATE TABLE Book_OnHand_has_Fee (


Book_OnHand_ID INT NOT NULL ,
Fee_ID_Fee INT NOT NULL ,
PRIMARY KEY (Book_OnHand_ID, Fee_ID_Fee) ,
CONSTRAINT fk_Book_OnHand_has_Fee_Book_OnHand1
FOREIGN KEY (Book_OnHand_ID)
REFERENCES Book_OnHand (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_OnHand_has_Fee_Fee1
FOREIGN KEY (Fee_ID_Fee)
REFERENCES Fee (ID_Fee)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

CREATE TABLE Library_Pass (


idLibrary_Pass INT NOT NULL ,
Library_Pass_Duration VARCHAR(25) NOT NULL ,
Library_Pass_DayGiven DATETIME NOT NULL ,
Library_Pass_ExpireDay DATETIME NOT NULL ,
Reader_IDreader INT NOT NULL ,
PRIMARY KEY (idLibrary_Pass) ,
CONSTRAINT fk_Library_Pass_Reader1
FOREIGN KEY (Reader_IDreader)
REFERENCES Reader (IDreader)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

INSERT INTO Book_OnHand (Book_exportDay, Book_returnDay, Book_ActualDayreturn, ID)


VALUES ('15.02.2018', '22.02.2018', NULL, 1);
INSERT INTO Book_OnHand (Book_exportDay, Book_returnDay, Book_ActualDayreturn, ID)
VALUES ('15.02.2018', '22.02.2018', NULL, 2);
INSERT INTO Book_OnHand (Book_exportDay, Book_returnDay, Book_ActualDayreturn, ID)
VALUES ('18.06.2017', '30.06.2017', '21.08.2017', 3);
INSERT INTO Book_OnHand (Book_exportDay, Book_returnDay, Book_ActualDayreturn, ID)
VALUES ('15.02.2018', '17.02.2018', NULL, 4);
INSERT INTO Book_OnHand (Book_exportDay, Book_returnDay, Book_ActualDayreturn, ID)
VALUES ('17.02.2018', '20.02.2018', '10.03.2018', 5);

INSERT INTO Staff (IDstaff, Staff_Name, Staff_Surname, Staff_MiddleName, Staff_Salary,


Staff_FirstDay, Staff_LastDay, Staff_BirthDay, Book_OnHand_ID) VALUES (1, 'Иван',
'Иванов', 'Иванович', 12000, '15.02.2018', NULL, '15.02.2018', 1);
INSERT INTO Staff (IDstaff, Staff_Name, Staff_Surname, Staff_MiddleName, Staff_Salary,
Staff_FirstDay, Staff_LastDay, Staff_BirthDay, Book_OnHand_ID) VALUES (2, 'Алла ',
'Дмитриева', 'Прикофьевна', 15000, '30.06.1991', '15.02.2018', '05.03.1953', 3);
INSERT INTO Staff (IDstaff, Staff_Name, Staff_Surname, Staff_MiddleName, Staff_Salary,
Staff_FirstDay, Staff_LastDay, Staff_BirthDay, Book_OnHand_ID) VALUES (3, 'Мария',
'Кондрабаева', 'Петровна', 100000, '03.01.1998', NULL, '15.03.1962', 4);
INSERT INTO Staff (IDstaff, Staff_Name, Staff_Surname, Staff_MiddleName, Staff_Salary,
Staff_FirstDay, Staff_LastDay, Staff_BirthDay, Book_OnHand_ID) VALUES (4, 'Кирилл',
'Каштанов', 'Сергеевич', 600000, '07.11.2016', NULL, '07.11.1999', 5);

INSERT INTO Reader (IDreader, Reader_Name, Reader_Surname, Reader_MiddleName,


Reader_JoinDay, Reader_OfDocumentNumber, Book_OnHand_ID) VALUES (1, 'Венера',
'Гильманова', 'Миневагизовна', '15.02.2018', 5465435, 3);
INSERT INTO Reader (IDreader, Reader_Name, Reader_Surname, Reader_MiddleName,
Reader_JoinDay, Reader_OfDocumentNumber, Book_OnHand_ID) VALUES (2, 'Мария',
'Альчикова', 'Сергеевна', '31.07.2018', 5456454, 2);

INSERT INTO Publisher (IDpublisher, Publisher_Name) VALUES (1, 'Просвещение');


INSERT INTO Publisher (IDpublisher, Publisher_Name) VALUES (2, 'Гелеос');

INSERT INTO Author (ID_Author, Author_Name) VALUES (1, 'А.С.Пушкин');


INSERT INTO Author (ID_Author, Author_Name) VALUES (2, 'М.Ю.Лермонтов');
INSERT INTO Author (ID_Author, Author_Name) VALUES (3, 'Л.Н. Толстой');
INSERT INTO Author (ID_Author, Author_Name) VALUES (4, 'М.А. Булгаков');
INSERT INTO Author (ID_Author, Author_Name) VALUES (5, 'А.Н. Толстой');
INSERT INTO Genre (ID_Genre, Genre_Name) VALUES (1, 'исторический');
INSERT INTO Genre (ID_Genre, Genre_Name) VALUES (2, 'сказка');
INSERT INTO Genre (ID_Genre, Genre_Name) VALUES (3, 'поэзия');
INSERT INTO Genre (ID_Genre, Genre_Name) VALUES (4, 'психологический');
INSERT INTO Genre (ID_Genre, Genre_Name) VALUES (5, 'реализм');
INSERT INTO Genre (ID_Genre, Genre_Name) VALUES (6, 'фантастика');

INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,


Author_ID_Author, Genre_ID_Genre) VALUES (1, 'Капитанская дочка', 1, 1, 1, 1);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (2, 'Сказка о золотом петушке', 3, 2, 1, 2);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (3, 'Мцыри', 4, 2, 2, 3);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (4, 'Герой нашего времени', 5, 1, 2, 4);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (5, 'Война и мир', 2, 1, 3, 1);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (6, 'Анна Каренина', 1, 2, 3, 5);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (7, 'Мастер и Маргарита', 4, 1, 4, 6);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (8, 'Белая гвардия', 5, 2, 4, 1);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (9, 'Хождение по мукам', 3, 2, 5, 1);
INSERT INTO Book (IDbook, Book_Name, Book_OnHand_ID, Publisher_IDpublisher,
Author_ID_Author, Genre_ID_Genre) VALUES (10, 'Гиперболоид и-ра Гарина', 4, 1, 5, 6);

INSERT INTO Provider (IDprovider, Provider_Name, Provider_Phone, Provider_Location,


Provider_Type) VALUES (1, 'Тезаурус', 4998989, 'Москва', 'Романы');
INSERT INTO Provider (IDprovider, Provider_Name, Provider_Phone, Provider_Location,
Provider_Type) VALUES (2, 'Современник', 4996699, 'Санкт-Петербург', 'Поэзия');

INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (1, 2);


INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (2, 1);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (3, 2);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (4, 1);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (5, 2);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (6, 1);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (7, 2);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (8, 1);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (9, 2);
INSERT INTO Book_has_Provider (Book_IDbook, Provider_IDprovider) VALUES (10, 1);

INSERT INTO Fee (ID_Fee, Fee_Type, Fee_price) VALUES (1, 'просрочка за 1 день', '10');
INSERT INTO Fee (ID_Fee, Fee_Type, Fee_price) VALUES (2, 'порча книги', '200');
INSERT INTO Fee (ID_Fee, Fee_Type, Fee_price) VALUES (3, 'потеря книги', '1000');
INSERT INTO Book_OnHand_has_Fee (Book_OnHand_ID, Fee_ID_Fee) VALUES (3, 2);

INSERT INTO Library_Pass (idLibrary_Pass, Library_Pass_Duration, Library_Pass_DayGiven,


Library_Pass_ExpireDay, Reader_IDreader) VALUES (1, '365', '15.02.2018', '15.02.2019', 1);
INSERT INTO Library_Pass (idLibrary_Pass, Library_Pass_Duration, Library_Pass_DayGiven,
Library_Pass_ExpireDay, Reader_IDreader) VALUES (2, '182', '31.07.2018', '31.01.2019', 2);

GO
CREATE TRIGGER Library_Pass_AFTER_INSERT ON Library_Pass AFTER INSERT,
UPDATE AS
BEGIN
update Library_Pass
set Library_Pass_Duration=365
where Library_Pass_Duration>365;
END
go
CREATE TRIGGER Book_OnHand_AFTER_INSERT ON Book_OnHand AFTER INSERT ,
UPDate as
BEGIN
update Book_OnHand
set Book_ActualDayreturn=Book_returnDay
where Book_ActualDayreturn<Book_returnDay;
END

go
CREATE TRIGGER Staff_AFTER_INSERT ON Staff AFTER INSERT, update as
BEGIN
update staff
set Staff_Salary=12000
where Staff_Salary<12000;

END

go
CREATE TRIGGER Fee_AFTER_INSERT ON Fee AFTER INSERT, update as
BEGIN
update Fee
set Fee_price=1000
where Fee_price>1000;
END

go
CREATE TRIGGER Fee_AFTER_UPDATE ON Fee AFTER UPDATE , insert as
BEGIN
update Staff
set Staff_Salary= Staff_Salary+1000;
END
Описание базы данных на языке SQL
Для MySQL WorkBench
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE Database `mydb`;


USE `mydb` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Book_OnHand` (


`Book_exportDay` DATETIME NOT NULL COMMENT '',
`Book_returnDay` DATETIME NOT NULL COMMENT '',
`Book_ActualDayreturn` DATETIME NULL COMMENT '',
`ID` INT NOT NULL COMMENT '',
PRIMARY KEY (`ID`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Staff` (


`IDstaff` INT NOT NULL COMMENT '',
`Staff_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Staff_Surname` MEDIUMTEXT NOT NULL COMMENT '',
`Staff_MiddleName` MEDIUMTEXT NULL COMMENT '',
`Staff_Salary` INT NOT NULL COMMENT '',
`Staff_FirstDay` DATE NOT NULL COMMENT '',
`Staff_LastDay` DATE NULL COMMENT '',
`Staff_BirthDay` DATE NOT NULL COMMENT '',
`Book_OnHand_ID` INT NOT NULL COMMENT '',
PRIMARY KEY (`IDstaff`) COMMENT '',
CONSTRAINT `fk_Staff_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_Staff_Book_OnHand1_idx` ON `mydb`.`Staff` (`Book_OnHand_ID` ASC) COMMENT '';

CREATE TABLE IF NOT EXISTS `mydb`.`Reader` (


`IDreader` INT NOT NULL COMMENT '',
`Reader_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Reader_Surname` MEDIUMTEXT NOT NULL COMMENT '',
`Reader_MiddleName` MEDIUMTEXT NULL COMMENT '',
`Reader_JoinDay` DATE NOT NULL COMMENT '',
`Reader_OfDocumentNumber` INT NOT NULL COMMENT '',
`Book_OnHand_ID` INT NOT NULL COMMENT '',
PRIMARY KEY (`IDreader`) COMMENT '',
CONSTRAINT `fk_Reader_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_Reader_Book_OnHand1_idx` ON `mydb`.`Reader` (`Book_OnHand_ID` ASC)


COMMENT '';

CREATE TABLE IF NOT EXISTS `mydb`.`Publisher` (


`IDpublisher` INT NOT NULL COMMENT '',
`Publisher_Name` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`IDpublisher`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Author` (


`ID_Author` INT NOT NULL COMMENT '',
`Author_Name` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`ID_Author`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Genre` (


`ID_Genre` INT NOT NULL COMMENT '',
`Genre_Name` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`ID_Genre`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Book` (


`IDbook` INT NOT NULL COMMENT '',
`Book_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Book_OnHand_ID` INT NOT NULL COMMENT '',
`Publisher_IDpublisher` INT NOT NULL COMMENT '',
`Author_ID_Author` INT NOT NULL COMMENT '',
`Genre_ID_Genre` INT NOT NULL COMMENT '',
PRIMARY KEY (`IDbook`) COMMENT '',
CONSTRAINT `fk_Book_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Publisher1`
FOREIGN KEY (`Publisher_IDpublisher`)
REFERENCES `mydb`.`Publisher` (`IDpublisher`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Author1`
FOREIGN KEY (`Author_ID_Author`)
REFERENCES `mydb`.`Author` (`ID_Author`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Genre1`
FOREIGN KEY (`Genre_ID_Genre`)
REFERENCES `mydb`.`Genre` (`ID_Genre`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_Book_Book_OnHand1_idx` ON `mydb`.`Book` (`Book_OnHand_ID` ASC) COMMENT '';

CREATE INDEX `fk_Book_Publisher1_idx` ON `mydb`.`Book` (`Publisher_IDpublisher` ASC) COMMENT '';

CREATE INDEX `fk_Book_Author1_idx` ON `mydb`.`Book` (`Author_ID_Author` ASC) COMMENT '';

CREATE INDEX `fk_Book_Genre1_idx` ON `mydb`.`Book` (`Genre_ID_Genre` ASC) COMMENT '';

CREATE TABLE IF NOT EXISTS `mydb`.`Provider` (


`IDprovider` INT NOT NULL COMMENT '',
`Provider_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Provider_Phone` INT NOT NULL COMMENT '',
`Provider_Location` MEDIUMTEXT NOT NULL COMMENT '',
`Provider_Type` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`IDprovider`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Book_has_Provider` (


`Book_IDbook` INT NOT NULL COMMENT '',
`Provider_IDprovider` INT NOT NULL COMMENT '',
PRIMARY KEY (`Book_IDbook`, `Provider_IDprovider`) COMMENT '',
CONSTRAINT `fk_Book_has_Provider_Book1`
FOREIGN KEY (`Book_IDbook`)
REFERENCES `mydb`.`Book` (`IDbook`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_has_Provider_Provider1`
FOREIGN KEY (`Provider_IDprovider`)
REFERENCES `mydb`.`Provider` (`IDprovider`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_Book_has_Provider_Provider1_idx` ON `mydb`.`Book_has_Provider`


(`Provider_IDprovider` ASC) COMMENT '';

CREATE INDEX `fk_Book_has_Provider_Book1_idx` ON `mydb`.`Book_has_Provider` (`Book_IDbook` ASC)


COMMENT '';

CREATE TABLE IF NOT EXISTS `mydb`.`Fee` (


`ID_Fee` INT NOT NULL COMMENT '',
`Fee_Type` VARCHAR(45) NOT NULL COMMENT '',
`Fee_price` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`ID_Fee`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Book_OnHand_has_Fee` (


`Book_OnHand_ID` INT NOT NULL COMMENT '',
`Fee_ID_Fee` INT NOT NULL COMMENT '',
PRIMARY KEY (`Book_OnHand_ID`, `Fee_ID_Fee`) COMMENT '',
CONSTRAINT `fk_Book_OnHand_has_Fee_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_OnHand_has_Fee_Fee1`
FOREIGN KEY (`Fee_ID_Fee`)
REFERENCES `mydb`.`Fee` (`ID_Fee`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_Book_OnHand_has_Fee_Fee1_idx` ON `mydb`.`Book_OnHand_has_Fee` (`Fee_ID_Fee`


ASC) COMMENT '';

CREATE INDEX `fk_Book_OnHand_has_Fee_Book_OnHand1_idx` ON `mydb`.`Book_OnHand_has_Fee`


(`Book_OnHand_ID` ASC) COMMENT '';

CREATE TABLE IF NOT EXISTS `mydb`.`Library_Pass` (


`idLibrary_Pass` INT NOT NULL COMMENT '',
`Library_Pass_Duration` MEDIUMTEXT NOT NULL COMMENT '',
`Library_Pass_DayGiven` DATETIME NOT NULL COMMENT '',
`Library_Pass_ExpireDay` DATETIME NOT NULL COMMENT '',
`Reader_IDreader` INT NOT NULL COMMENT '',
PRIMARY KEY (`idLibrary_Pass`) COMMENT '',
CONSTRAINT `fk_Library_Pass_Reader1`
FOREIGN KEY (`Reader_IDreader`)
REFERENCES `mydb`.`Reader` (`IDreader`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_Library_Pass_Reader1_idx` ON `mydb`.`Library_Pass` (`Reader_IDreader` ASC)


COMMENT '';

USE `mydb`;

DELIMITER $$
USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Book_OnHand_AFTER_INSERT` AFTER INSERT
ON `Book_OnHand` FOR EACH ROW
BEGIN
update Book_OnHand
set Book_ActualDayreturn=Book_returnDay
where Book_ActualDayreturn<Book_returnDay;
END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Staff_AFTER_INSERT` AFTER INSERT ON
`Staff` FOR EACH ROW
BEGIN
update staff
set Staff_Salary=12000
where Staff_Salary<12000;

END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Fee_AFTER_INSERT` AFTER INSERT ON `Fee`
FOR EACH ROW
BEGIN
update Fee
set Fee_price=1000
where Fee_price>1000;
END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Fee_AFTER_UPDATE` AFTER UPDATE ON
`Fee` FOR EACH ROW
BEGIN
update Staff
set Staff_Salary= Staff_Salary+1000;
END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Library_Pass_AFTER_INSERT` AFTER INSERT
ON `Library_Pass` FOR EACH ROW
BEGIN
update Library_Pass
set Library_Pass_Duration=365
where Library_Pass_Duration>365;
END
$$

DELIMITER ;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`, `Book_returnDay`, `Book_ActualDayreturn`, `ID`)
VALUES ('15.02.2018', '22.02.2018', NULL, 1);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`, `Book_returnDay`, `Book_ActualDayreturn`, `ID`)
VALUES ('15.02.2018', '22.02.2018', NULL, 2);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`, `Book_returnDay`, `Book_ActualDayreturn`, `ID`)
VALUES ('18.06.2017', '30.06.2017', '21.08.2017', 3);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`, `Book_returnDay`, `Book_ActualDayreturn`, `ID`)
VALUES ('15.02.2018', '17.02.2018', NULL, 4);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`, `Book_returnDay`, `Book_ActualDayreturn`, `ID`)
VALUES ('17.02.2018', '20.02.2018', '10.03.2018', 5);

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`, `Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`,
`Staff_FirstDay`, `Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (1, 'Иван', 'Иванов',
'Иванович', 12000, '15.02.2018', NULL, '15.02.2018', 1);
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`, `Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`,
`Staff_FirstDay`, `Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (2, 'Алла ', 'Дмитриева',
'Прикофьевна', 15000, '30.06.1991', '15.02.2018', '05.03.1953', 3);
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`, `Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`,
`Staff_FirstDay`, `Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (3, 'Мария', 'Кондрабаева',
'Петровна', 100000, '03.01.1998', NULL, '15.03.1962', 4);
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`, `Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`,
`Staff_FirstDay`, `Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (4, 'Кирилл', 'Каштанов',
'Сергеевич', 600000, '07.11.2016', NULL, '07.11.1999', 5);

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Reader` (`IDreader`, `Reader_Name`, `Reader_Surname`, `Reader_MiddleName`,
`Reader_JoinDay`, `Reader_OfDocumentNumber`, `Book_OnHand_ID`) VALUES (1, 'Венера', 'Гильманова',
'Миневагизовна', '15.02.2018', 5465435, 3);
INSERT INTO `mydb`.`Reader` (`IDreader`, `Reader_Name`, `Reader_Surname`, `Reader_MiddleName`,
`Reader_JoinDay`, `Reader_OfDocumentNumber`, `Book_OnHand_ID`) VALUES (2, 'Мария', 'Альчикова',
'Сергеевна', '31.07.2018', 5456454, 2);

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Publisher` (`IDpublisher`, `Publisher_Name`) VALUES (1, 'Просвещение');
INSERT INTO `mydb`.`Publisher` (`IDpublisher`, `Publisher_Name`) VALUES (2, 'Гелеос');

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`) VALUES (1, 'А.С.Пушкин');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`) VALUES (2, 'М.Ю.Лермонтов');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`) VALUES (3, 'Л.Н. Толстой');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`) VALUES (4, 'М.А. Булгаков');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`) VALUES (5, 'А.Н. Толстой');

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`) VALUES (1, 'исторический');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`) VALUES (2, 'сказка');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`) VALUES (3, 'поэзия');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`) VALUES (4, 'психологический');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`) VALUES (5, 'реализм');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`) VALUES (6, 'фантастика');

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (1, 'Капитанская дочка', 1, 1, 1, 1);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (2, 'Сказка о золотом петушке', 3, 2, 1, 2);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (3, 'Мцыри', 4, 2, 2, 3);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (4, 'Герой нашего времени', 5, 1, 2, 4);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (5, 'Война и мир', 2, 1, 3, 1);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (6, 'Анна Каренина', 1, 2, 3, 5);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (7, 'Мастер и Маргарита', 4, 1, 4, 6);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (8, 'Белая гвардия', 5, 2, 4, 1);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (9, 'Хождение по мукам', 3, 2, 5, 1);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`, `Book_OnHand_ID`, `Publisher_IDpublisher`,
`Author_ID_Author`, `Genre_ID_Genre`) VALUES (10, 'Гиперболоид и-ра Гарина', 4, 1, 5, 6);

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Provider` (`IDprovider`, `Provider_Name`, `Provider_Phone`, `Provider_Location`,
`Provider_Type`) VALUES (1, 'Тезаурус', 4998989, 'Москва', 'Романы');
INSERT INTO `mydb`.`Provider` (`IDprovider`, `Provider_Name`, `Provider_Phone`, `Provider_Location`,
`Provider_Type`) VALUES (2, 'Современник', 4996699, 'Санкт-Петербург', 'Поэзия');

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (1, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (2, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (3, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (4, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (5, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (6, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (7, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (8, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (9, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`, `Provider_IDprovider`) VALUES (10, 1);

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Fee` (`ID_Fee`, `Fee_Type`, `Fee_price`) VALUES (1, 'просрочка за 1 день', '10');
INSERT INTO `mydb`.`Fee` (`ID_Fee`, `Fee_Type`, `Fee_price`) VALUES (2, 'порча книги', '200');
INSERT INTO `mydb`.`Fee` (`ID_Fee`, `Fee_Type`, `Fee_price`) VALUES (3, 'потеря книги', '1000');

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book_OnHand_has_Fee` (`Book_OnHand_ID`, `Fee_ID_Fee`) VALUES (3, 2);

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Library_Pass` (`idLibrary_Pass`, `Library_Pass_Duration`, `Library_Pass_DayGiven`,
`Library_Pass_ExpireDay`, `Reader_IDreader`) VALUES (1, '365', '15.02.2018', '15.02.2019', 1);
INSERT INTO `mydb`.`Library_Pass` (`idLibrary_Pass`, `Library_Pass_Duration`, `Library_Pass_DayGiven`,
`Library_Pass_ExpireDay`, `Reader_IDreader`) VALUES (2, '182', '31.07.2018', '31.01.2019', 2);

COMMIT;

Запросы

№ Запрос Пояснение
1 SELECT Book_OnHand.ID , Book.Book_Name Показывает какой
from Staff inner join Reader inner join Book_OnHand inner join работник какую
Book книгу выдал (их
on Staff.Book_OnHand_ID=Reader.Book_OnHand_ID айди) группирует
on Staff.Book_OnHand_ID=Book_OnHand.ID по имени.
on Book.Book_OnHand_ID=Book_OnHand.ID
Group By Book.Book_Name
2 Select Staff.Name,Staff.Surname Показывает
from Staff работников с
where Staff.Staff_Salary>25000 зарплатой больше
25 тыс.
3 Select Book.Book_Name, Genre.Genre_Name Показывает книги
from Book inner join Genre жанра
on Book.Genre_ID_Genre=Genre.ID_Genre «фантастика»
where Genre.ID_Genre=6
Group by Genre.Genre_Name
4 Select Book.Book_Name, Author.Author_Name Показывает все
from Book inner join Author книги Булгакова
on Book.Author_ID_Author=Author.ID_Author
where Author.ID_Author=4
Group by Author.Author_Name
5 Select Book.Book_Name, Publisher.Publisher_Name Показывает все
from Book inner join Publisher книги издательства
on Book.Publisher_IDpublisher=Publisher.IDpublisher «Просвещение»
where Publisher.IDpublisher=1
Group by Publisher.Publisher_Name
6 Select Reader.Name, Reader.Surname Показывает имена
from Reader inner join Library_Pass и фамилии
on Reader.IDreader=Library_Pass.Reader_IDreader читателей чьи
where Library_Pass_Duration=365 пропуски длятся
Group by Reader.IDreader год
7 Select Fee.Fee_Type Показывает все
from Fee типы штрафов ,
where Fee.Fee_price>100 плата за которые
превышает 100
рублей
8 Select Staff.Name,Staff.Surname Показывает имя и
from Staff фамилию человека
Where Staff.Name,Staff.Surname с максимальной
from Staff.Staff_Salary=( SELECT MAX( Staff_Salary) From зарплатой
Staff)
9 Select AVG( Staff_Salary) Показывает
from Staff среднюю зарплату
персонала
10 SELECT AVG(Staff_Salary) Показывает
FROM Staff среднюю зарплату
WHERE Staff.Staff_LastDay ISNOTNULL не уволенного
персонала