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

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ

ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего
образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА 2
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ

РУКОВОДИТЕЛЬ
канд. тех. наук, доцент В.А. Галанина
должность, уч. степень, звание подпись, дата инициалы, фамилия

ЛАБОРАТОРНАЯ РАБОТА №1

СОЗДАНИЕ ТАБЛЛИЦ В СУДБ POSTGRESQL

по дисциплине: БАЗЫ ДАННЫХ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №
подпись, дата инициалы, фамилия

Санкт-Петербург 2022
1) Цель лабораторной работы: Научиться создавать структуру таблиц,
задавать типы полей, ограничения на поля и таблицы.

2) Описание предметной области:

База данных создаётся для информационного обслуживания


редакторов, менеджеров и других сотрудников компании. БД должна
содержать данные о сотрудниках компании, книгах, авторах, финансовом
состоянии компании и предоставлять возможность получать разнообразные
отчёты. В соответствии с предметной областью система строится с учётом
следующих особенностей:

каждая книга издаётся в рамках контракта;

книга может быть написана несколькими авторами;

контракт подписывается одним менеджером и всеми авторами книги;

каждый автор может написать несколько книг (по разным


контрактам);

порядок, в котором авторы указаны на обложке, влияет на размер


гонорара; если сотрудник является редактором, то он может работать
одновременно над несколькими книгами;

у каждой книги может быть несколько редакторов, один из них–


ответственный редактор;

каждый заказ оформляется на одного заказчика;

в заказе на покупку может быть перечислено несколько книг.

3) Ход выполнения лабораторной работы:

1. Нарисуем таблицы, выберем типы полей, определим ключевые поля


и зададим ограничения на поля или таблицу в целом. Используя менеджер
баз данных DBeaver (свободно распространяемый кроссплатформенный)
создадим соответствующие таблицы средствами СУБД PostgreSQL.

2
Рисунок 1 – Структура таблиц в DBeaver

Рисунок 2 – Скриншот кода в редакторе SQL

3
Рисунок 3 – Скриншот кода в редакторе SQL. Часть 2

4
Рисунок 4 – Скриншот кода в редакторе SQL. Часть 3

5
Рисунок 5 – Скриншот кода в редакторе SQL. Часть 4

Рисунок 6 – Скриншот кода в редакторе SQL. Часть 5

4) Вывод:

6
В ходе проведения лабораторной работы были получены первичные
навыки создания структуры таблиц, определения типы полей, задания
ограничений на поля и таблицы.

--- Добавление ограничений

ALTER TABLE order_info ADD check (order_incoming_date <


order_implementation_date); -- Дата поступления заказа < дата выполнения
заказа

ALTER TABLE orders ADD COLUMN book_sum int; -- Cумма в


строки_заказа

alter TABLE rooms ALTER COLUMN phone_number set default


89190000000 -- Добавление номера по умолчанию

alter table rooms alter column phone_number drop default -- Удаление


ограничения

ALTER TABLE orders RENAME TO order_lines -- Изменение имени


таблицы

alter table book_info add column authors text [] -- Создание атрибута


"авторы" с типом поля список

alter table book_info drop column -- Удаление атрибута

-- Заказчики

insert into customers (customer_no,customer_name,customer_address)


values
7
(1,'Иванов Иван Иваныч', 'Речная 25'),

(2,'Петрова Анна Егоровна', 'Фрунзе 10'),

(3,'Марченко Захар Владимирович', 'Ленина 2'),

(4,'Киркоров Филипп Бедросович', 'Кувшинова 31'),

(5,'Якин ПАвел Тереньтьевич', 'Горина 21');

-- Заказчики

insert into positions (position_id,position_name,salary) values

(1,'редактор 1', 20000),

(2,'редактор 2', 21000),

(3,'редактор 3', 35000),

(4,'менеджер 1', 48000),

(5,'менеджер 2', 50000);

insert into positions (position_id,position_name,salary) values

(6,'главный редактор', 100000);

insert into rooms (rooms_no,phone_number) values

(10,553355),

(11,553356),

(12,553357),

(13,553358),

(14,553359);

8
alter table authors alter column full_name type varchar (100); --
Увеличение поля ФИО

-- Авторы

insert into authors (author_id, full_name, passport, INN, author_address,


phone_number) values

(1, 'Марьянов Павел Валентинович', 031512345,1234123342,'ул Победы


4', 89192345231),

(2, 'Марьянова Анна Валентиновна', 031512334,1230023342,'ул Победы


191', 89196355231),

(3, 'Юдина Александра Александровна', 836012345, 1939123342, 'ул


Манхоне 9', 89199470231),

(4, 'Кирвилидзе Эльдар Степанович', 548312345, 1234120024, 'проспект


Некоглая 2', 89164905231),

(5, 'Абдурахманов Абдурахман Абдурахманович',


923612345,18620123342, 'ул Янкогского 19/3', 89100005231);

alter table book_info rename column editor to main_editor;

alter table author book add FOREIGN key (book_id) REFERENCES


book_info(book_id);

alter table employees alter column full_name type varchar (100);

alter table employees alter column passport type Bigint;

alter table employees alter column inn type Bigint;

9
-- Сотрудники

insert into employees (table_id, full_name, gender, passport, inn,


position_name, room_no) values

(100, 'Устинов Валерий Георгьевич', 'м', 131512300, 12324367890,1, 10),

(101, 'Субботин Варлам Петрович', 'м', 572012300, 845394367890,2,11),

(102, 'Устинов Валерий Георгьевич','м',630112300, 10484367890,3,12),

(103, 'Макарова Адель Адольфовна','ж',112212300, 12325306890,4,13),

(104, 'Кошелева Ясмина Мэлоровна','ж',198712300, 12319347890,5,14);

insert into book_info (book_id, book_name, price, circulation, main_editor)


values

(1, 'Северное сияние', 5000, 100000,100),

(2, 'Безмятежность', 5400, 100000, 102),

(3, 'Гарри Поттер', 4900, 130000,104),

(4, 'Смелость и отвага, 4200, 120000, 103),

(5, 'Ресторан на краю обрыва, 3440, 200000,101);

insert into editors_books (book_id, editor) values

(1,100),

(2,102),

(3,104),

(4,103),

(5,101);

10
insert into contracts (contract, contract_date, authors_honorarium, spending,
release_date, book_id) values

(10, '10-10-2020, 20000, 19000, 20-10-2020',1);

insert into contracts (contract, contract_date, authors_honorarium, spending,


release_date, book_id) values

(11, '09-02-2020', 21000, 8000, '20-02-2020,2),

(12, 01-02-2020, 30000,6800, '28-02-2020,3),

(13, 14-08-2020,17000, 5000, '19-08-2020,4),

(14, '01-06-2020,31000, 11000, '01-07-2020',2);

alter table author book drop column contract;

insert into author_book (book_id,author_id,list_num, honorarium) values

(1,2,1,100000),

(2,3,2,100000),

(3,4,1,120000),

(4,4,1,10000),

(5,1,1,140000);

insert into order_info (order_no,


customer_no,order_incoming_date,order_implementation_date, delivery_adress,
amount_coust, manager) values

(1,2, 01-03-2020', '10-03-2020', 'магазиг "Перегрми"", 100000,100);


11
insert into order_info (order_no,
customer_no,order_incoming_date,order_implementation_date, delivery_adress,
amount_coust, manager) values

(2,1,'11-03-2020', '21-03-2020','ул Вивальы 2',120000,101),

(3,3,17-04-2020', '27-04-2020', 'ул улинки 20/3',140000,102),

(4,4,25-05-2020', '30-05-2020', 'yл Вольекa 1',150000,103),

(5,5,'22-06-2020', '27-06-2020', 'yл бeгeмота 10',134000,104);

alter table order_lines drop column book_sum;

insert into order_lines (order_no,books_num,book_id,book_sum) values

(1,100,1, 30000),

(2,150,1, 35000),

(3,200,1, 33000),

(4,180,1, 20000),

(5,300,1, 28000);

22222222222222222222

select * from contracts; --Вывод сведений обо всех контрактах

select * from authors; --Вывод сведений обо всех авторах

12
select * from book_info; --Вывод сведений обо всех книгах

select * from book_info where main_editor 100; --Вывод сведений о


книгах, где менеджер ... (ID менеджера)

select * from order_info of where order_incoming_date < '2020-05-30';--


Вывести сведения о заказах, заключенных ранее ... (дата заказа)

alter table order_info add column deadline date;

update order_info set deadline = '2020-03-11' where order_no = 1;

update order_info set deadline = '2020-03-28' where order_no = 2;

update order_info set deadline = '2020-04-25' where order_no = 3;

update order_info set deadline = '2020-05-26' where order_no = 4;

update order info set deadline = '2020-07-01' where order_no = 5;

insert into order_info (deadline) values

('2020-03-11'),

('2020-03-28'),

('2020-04-25'),

('2020-05-26'),

('2020-07-01');

select order_implementation_date as out_deadline,


customer_no,order_incoming_date,order_implementation_date,

delivery_adress, amount_coust, full_name from order_info, employees

13
where order_implementation_date > deadline; ---Вывод сведений о
невыполненных в срок заказах. ???

select contract, authors_honorarium from contracts; --Вывод сведений


Номер_контракта, Авторский гонорар

select max(manager) AS id,

count(order_no) AS quantity

from order_info group by manager; --Вывод количества заказов для всех


менеджеров

insert into book_info (book_id, book_name, price, circulation, main_editor)


values

(6, 'головашка', 4990,90000,101);

select * from (select count(book_id) AS quantity,

main_editor AS id from book_info group by main_editor) as quanty; --


Вывести менеджера, заключившего наибольшее число контрактов

update employees set full_name = 'Михайлюк Павел Аркадьевич' where


table_id = 102;

select book_name, full_name from book_info, employees where


book_info.main_editor = employees.table_id

group by book_name, full_name ; --Вывод ответственных редакторов и


соответствующих книги &&&&

14
select full_name, book_name from authors, book_info, author_book where
book_info.book_id = author_book.book_id

and authors.author_id = author_book.author_id

group by full_name ,book_name order by full_name; --Вывод списка


"книга-авторы"

select avg(authors_honorarium) from contracts; --Вывод размера среднего


гонорара по каждой книге

3333333333333333333333333333

select order_id, order_incoming_date, customer_name, customer_address


from order_info join customers on order_info.customer_id =
customers.customer_id;

select contract, contract date, table_id, full_name, room_id, phone_number


from contracts join

(select book_id, table_id, full_name, room_id, phone_number from


book_info join (select table_id, full_name, rooms.room_id, phone_number from
employees

join rooms on employees.room_id = rooms.room_id) as tbl1 on


tbl1.table_id=book_info.editor) as tbl2 on contracts.book_id = tb12.book_id;

15
select table_id, full_name, book_name, contract, contract_date from (select
table_id, full_name, book_id, book_name

from employees left join book_info on employees.table_id =


book_info.editor) as tbl1 left join (select contract, contract_date, book_id

from contracts) as tbl2 on tbl1.book_id = tbl2.book_id order by table_id;

select full_name, positions.position_name, salary from employees

join positions on employees.position_name = positions.position_id;

select book_name, full_name, author_address, phone_number, (honorarium


* POWER(0.95,list_num)) as

гонорар_c_учетом_мecтa, list_num from book_info join (select full_name,


author_address, phone_number, list_num, honorarium, book_id

from authors join author_book on authors.author_id =


author_book.author_id) as tablel on table1.book_id = book_info.book_id;

select table_id, full_name, contract, contract_date, book_name from (select


contract, contract_date, book_name, book_info.book_id

from contracts join book_info on contracts.book_id = book_info.book_id) as


tbl1 right join (select table_id, full_name, book_id

from employees left join editors_books on table_id = editor) as tbl2 on


tbl1.book_id = tbl2.book_id;

select book_name, price, circulation, full_name, author_address,


phone_number

16
from book_info join (select full_name, author_address, phone_number,
book_id from authors join author_book on

authors.author_id = author_book.author_id) as tbl1 on book_info.book_id =


tbl1.book_id;

select * from employees where table_id not in (select editor from book_info
group by editor order by editor);

4444444444444

create function ex1 (int)

returns int

as

'select count(contract) as count_contracts from (select contract, table_id


from contracts join (select book_id, table_id

from book_info join employees on editor = table_id where table_id = $1) as


tbl1 on contracts.book_id = tbl1.book_id) as

tb12 group by table_id'

language 'sql';

select ex1(3);

create function ex2 (int)


17
returns table(contract int, contract_date date, table_id int, full_name
varchar(100), room_id int, phone_number varchar(30))

as

'select contract, contract_date, table_id, full_name, room_id, phone_number

from contracts join (select table_id, full_name, room_id, phone_number,


book_id

from book_info join (select table_id, full_name, rooms.room_id,


phone_number from employees join rooms on

employees.room_id = rooms.room_id) as tbl1 on book_info.editor =


tbl1.table_id) as tbl3 on contracts.book_id =

tb13.book_id where contract = $1'

language 'sql';

select * from ex2(3) ;

create function ex3 ()

returns table(table_id int, full_name varchar(100), sex varchar(5), passport


bigint, INN bigint, position_name int, room_id int )

as

'select * from employees where table_id not in

(select editor from book_info group by editor order by editor)'

language 'sql';

select * from ex3();


18
select * from book_info;

create or replace function employeer_delete_function()

returns trigger

as $$

begin

delete FROM contracts WHERE book_id = (select book_id from book_info


where book_info.editor = old.table_id);

delete from order_info where manager = old.table_id;

delete from orders where book_id = (select book_id from book_info where
book_info.editor = old.table_id);

delete from editors_books where book_id = (select book_id from book_info


where book_info.editor = old.table_id);

delete from editors_books where editor = old.table_id;

delete from book_info where editor = old.table_id;

RETURN old;

end

$$language 'plpgsql';

create or replace trigger lab5ex4

before delete on employees

for each row

execute function employeer_delete_function();


19
select * from author_book;

create or replace function recalc_honorar()

returns trigger

as $$

begin

update author_book set honorarium =


round(power(0.9,list_num)*honorarium) where book_id = new.book_id;

return new;

end

$$language 'plpgsql';

create or replace trigger lab5ex5

after insert on author book

for each row

execute function recalc_honorar();

insert into author_book(book_id, author_id, list_num, honorarium) values


(7, 5, 7, 17000);

select * from author book;

20
21

Вам также может понравиться