You are on page 1of 40

Міністерство освіти і науки України

ЖДТУ Житомирський державний технологічний університет

Затверджено науково-
методичною
радою ЖДТУ
протокол від
«__»_______ 20__ р.
№__

МЕТОДИЧНІ РЕКОМЕНДАЦІЇ
До лабораторних робот студентів з дисципліни
«_БАЗИ ДАНИХ»

для студентів освітнього рівня «БАКАЛАВР»


денної форми навчання
121 «Інженерія програмного забезпечення»
факультет інформаційно-комп’ютерних технологій
кафедра інженерії програмного забезпечення

Робочу програму схвалено


на засіданні кафедри
інженерії програмного
забезпечення протокол від
«28» серпня 2017 р. № 1
Завідувач кафедри ІПЗ
________________ А.В.
Панішев

Розробники: старший викладач кафедри ІПЗ Данильченко А.О,


к.т.н. доц. кафедри ІПЗ Сугоняк Інна Іванівна

Житомир
2017 – 2018 н.р.
Методичні вказівки до лабораторного практикуму з дисципліни
«Бази даних» для студентів спеціальності «Програмне
забезпечення систем» / Укладачі А.О. Данильченко, І.І.Сугоняк. –
Житомир: ЖДТУ, 2016. – 24с.

Укладачі: Данильченко Анна Олександрівна, старший викладач


кафедри програмної інженерії, Сугоняк Інна Іванівна, доцент
кафедри програмного забезпечення систем

Відповідальний редактор: Панішев Анатолій Васильович,


завідувач кафедри програмного забезпечення систем, д.т.н.,
професор
Рецензент: Ковальчук Андрій Михайлович, доцент кафедри ПЗС,
к.т.н, доцент

2
Лабораторна робота № 3
Тема: СТВОРЕННЯ СХЕМ БД НА МОВІ SQL
Мета роботи: дослідження запитових технологій
створення схем БД на мові SQL в середовище MS SQL Server.
Теоретичні відомості
Довідник по MS SQL SERVER 2014 -
http://msdn.microsoft.com/ruru/library/ms187875.aspx
Теоретичні відомості
Типи даних
Синоніми типів даних
Створення БД
Створення таблиці
Зміна структури таблиці
Створення схеми БД
Знищення таблиці
Регулярні вирази TSQL

Завдання 1.
1. Створити базу даних за індивідуальним варіантом.
2. У відповідності до схеми БД спроектованої в
лабораторній роботі № 1 створити таблиці бази даних та
визначити зв’язки між ними.
3. Створити схему даних.
4. Виконати генерацію БД «Рейтинг» з AllFussion Data
Modeler (ERWin) в середовище MS SQL Server.
5. Відредагувати отриману БД.
6.
ХІД РОБОТИ

1. Запустити SQL Server Manager Studio Express.

3
2. Оновити реєстрацію локального сервера або
зареєструвати новий сервер баз даних (Server
Register…) у вікні „Зареєстровані сервери”.
3. У вікні оглядача об‘єктів виконати під‘єднання до
сервера (рис.3.1).

Рис.3.1.
Створення БД

4. Створити БД (пример Торговая фирма, схема рис. 3.2)

4
Рис.3.3. Головне вікно БД та редактор запитів

Для створення БД інструкцією SQL обираємо на панелі


інструментів команду New Query. Виконати запит – команда (!
Execute або F5 або CTRL+E).
Приклад інструкції для створення БД:
create database torgfirm
on primary
(name = torg1,
FILENAME="e:\bd\torg1.mdf",
SIZE=100 MB, MAXSIZE=200, FILEGROWTH=20),
(name = torg2,
FILENAME="e:\bd\torg2.mdf",
SIZE=100 MB, MAXSIZE=200, FILEGROWTH=20),
(name = torg3,
FILENAME="e:\bd\torg3.mdf",
SIZE=100 MB, MAXSIZE=200, FILEGROWTH=20)
LOG ON
(NAME=Archlog1,
FILENAME="e:\bd\torg1.ldf",
SIZE=100MB, MAXSIZE=200, FILEGROWTH=20)

5
Спрощений варіант:
create database torgfirm

Увага! Всі створені запити зберігати для подальшої перевірки

1. Для створення таблиці власноруч обираємо на панелі


інструментів комадну створити. Запити створюємо у відповідності
до наведено інфологічної моделі БД. Виконати запит – команда
(Выполнить, Ctrl+E або F5). Наприклад, для створення таблицы
«Postachalnik» можна використати SQL запит, який має наступний
вигляд:
create table postachalnik
(id_postach int IDENTITY(1,1) not null primary key,
Nazva varchar(20) constraint nazva_format check (Nazva like '[А-я]%'),
Index_p char(5) constraint ind_format check (index_p like '[0-9][0-9][0-
9][0-9][0-9]') default 100000,
Addr varchar(50),
City varchar(20) constraint city_format check (City like 'м. [А-я]%'),
Region varchar(50),
tel char(12) check (tel like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-
9][0-9]')
Для таблиці ТОVAR можна використати наступний скрипт:
create table tovar
(id_tovar int IDENTITY(1,1) not null primary key,
Nazva_t varchar(20) constraint nazva_tf check (Nazva_t like '[А-я]%'),
Min_zap int check (Min_zap >0) default 10,
Zap_skl int,
price money,
post_prek smallint check (post_prek in (0,1)),
id_postach int not null foreign key (id_postach) references
dbo.postachalnik(id_postach) on delete cascade on update no action
);

Для таблиці ZAKAZ_TOVAR можна використати наступний

6
синтаксис:
create table zakaz_tovar(
id_zakaz int not null,
id_tovar int not null references tovar(id_tovar) on update no action on delete
cascade,
kilk int check (kilk>0),
znigka decimal (3,2)
primary key (id_zakaz, id_tovar))

1. За допомогою скрипта Alter Table можна забезпечити


зв‘язок даної таблиці з іншими або змінити його параметри.
Необхідно передбачити наявність зв‘язку та правила
підтримки цілосноті даних:
alter table tovar add foreign key (id_postach) references
dbo.postachalnik(id_postach) on delete no action on update cascade

Змінити таблицю:
ALTER TABLE zakaz_tovar DROP CONSTRAINT
[FK__zakaz_tov__id_to__2B3F6F97]
Або ALTER TABLE [dbo].[zakaz_tovar] add primary key (id_zakaz,
id_tovar)
Або ALTER TABLE [zakaz_tovar] add foreign key (id_tovar) references
tovar(id_tovar) on delete cascade on update no action

6. Необхідно при створення таблиць БД застосувати всі 6 типів


обмежень на дані для довільних полів і таблиць.
Перевірити коректність роботи бази даних увівши по три
записи до кожної таблиці.

7
Лабораторна робота №4.

Тема: Прості запити на вибірку. Використання SELECT.

Мета роботи: дослідження властивостей DML-інструкції


SELECT для пошуку та відбору записів БД із використанням
предикатів.
Теоретичні відомості
SELECT повертає рядки з бази даних і дозволяє робити
вибірку однієї або декількох рядків або стовпців з однієї або
декількох таблиць в SQL Server. Повний синтаксис інструкції
SELECT складний, проте основні пропозиції можна коротко
описати таким чином:
[WITH <common_table_expression>]
SELECT select_list [INTO new_table]
[FROM table_source] [WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]]
Оператори UNION, EXCEPT і INTERSECT можна
використовувати між запитами, щоб порівняти їх результати або
об'єднати в один результуючий набір.
Синтаксичні позначення в Transact-SQL
Синтаксис:
<SELECT statement> :: =
[WITH <common_table_expression> [... n]]
<Query_expression>
[ORDER BY {order_by_expression | column_position [ASC | DESC]}
[... N]]
[<FOR Clause>]

8
[OPTION (<query_hint> [... n])]
<Query_expression> :: =
{<Query_specification> | (<Query_expression>)}
[{UNION [ALL] | EXCEPT | INTERSECT}
<Query_specification> | (<Query_expression>) [... n]]
<Query_specification> :: =
SELECT [ALL | DISTINCT]
[TOP (expression) [PERCENT] [WITH TIES]]
<Select_list>
[INTO new_table]
[FROM {<table_source>} [... n]]
[WHERE <search_condition>]
[<GROUP BY>]
[HAVING <search_condition>]
Зауваження.
Порядок пропозицій в інструкції SELECT має значення.
Будь-яке з необов'язкових пропозицій може бути опущено; але
якщо необов'язкові пропозиції використовуються, вони повинні
слідувати в певному порядку.
Інструкції SELECT дозволено використовувати в
обумовлених користувачем функції тільки в тому випадку, якщо
списки вибору цих інструкцій містять вирази, які привласнюють
значення змінним, локальним для функцій.
Логічний порядок обробки інструкції SELECT
Докладніші відомості про процес демонструють логічний порядок
обробки або порядок прив'язки інструкції SELECT. Цей порядок
визначає, коли об'єкти, визначені в одному кроці, стають
доступними для пропозицій в наступних кроках. Наприклад, якщо
обробник запитів можна прив'язати (для доступу) до таблиць або
уявленнями, визначеним у реченні FROM, ці об'єкти і їх стовпці

9
стають доступними для всіх наступних кроків. І навпаки, оскільки
пропозиція SELECT є кроком 8, будь-які псевдоніми стовпців або
похідних стовпців, певні в цьому реченні, не можуть бути об'єктом
для посилання попередніх пропозицій. Разом з тим до них можуть
звертатися наступні пропозиції, наприклад пропозицію ORDER
BY. Зверніть увагу, що фактичне практичне виконання оператора
визначається обробником запитів і порядок з цього списку може
значно відрізнятися.
1. FROM
2. ON
3. JOIN
4. where
5. GROUP BY
6. WITH CUBE або WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Завдання.
1. Заповнити БД «Торгівельна фірма» та внести довільні дані
таким чином, щоб у таблицях «Postachalnik», «Klient»,
«Sotrudnik» було не менше 6 записів. В таблиці «Tovar» не
менше 10 записів, у таблиці «Zakaz» не менше 10 записів, у
таблиці «Zakaz_tovar» не менще 20 записів.

10
2. Виконати запити наведені у ході роботи.
3. Створити самостійно наступні запити:
4. Перелік замовлень до певної дати для товару молоко.
5. Перелік товарів ціна яких знаходиться в заданому діапазоні
ы кылькысть на склады не менше 15 одиниць.
6. Перелік замовлень для яких не визначено дату виконання.
7. Перелік товарів певного постачальника наявних у
визначеній кількості.
8. Визначити вартість всіх замовлених товарів за останні 30
днів, якщо постачальники є ТОВ.
9. Визначити коди співробітників та дати, коли вони
обслуговували замолення від певного клієнту
10. Перелік постачальників що є ЗАТ і не постачали товарів
11. Перелік клієнтів що є ПП і купували товари в попередньому
місяці.
12. Перелік співробітників, на ім‘я Андрій впорядкувати за
абеткою
13. Перелік клієнтів що мають e-mail впорядкувати за id.
14. Створити за індивідуальним варіантом запити до БД із
використанням всіх типів умов відбору не менше 10
запитів. Запити мають містити дві або більше умов відбору і
декілька таблиць.

Хід роботи
Під’єднати БД «Торгівельна фірма».

11
2. Додати в таблиці власні данні таким чином, щоб в таблицях
Postachalnik, Klient, Sotrudnik було не менше 6 записів. В таблиці
Tovar не менше 10 записів, В таблиці Zakaz неменше 10 записів, в
таблиці Zakaz_tovar не менще 20 записів:

12
3. Створити наступні запити:
Вивести всі поля з таблиці Tovar
SELECT Tovar.*
FROM Tovar;

2. Вивести наступні поля з таблиці Postachalnik


SELECT K_postach, Nazva, Tel, Kontakt_osoba
FROM postachalnik;

3. Вивести всіх постачальників що мешкають в м.Києв

13
SELECT City, Nazva
FROM Postachalnik
WHERE City LIKE 'К%';

4. Вивести загальну вартість за кожним видом товарів, що


знаходиться на складі
SELECT Nazva, price*nasklade AS Vartist
FROM Tovar;

5. Вивести всі закази що потрібно виконати в листопаді


SELECT zakaz.*
FROM zakaz
WHERE zakaz.date_naznach Between '01.01.2001' And '01.01.2015';

6. Вивести номери заказів що містять товари йогурт та молоко


SELECT zakaz_tovar.K_zakaz
FROM zakaz_tovar
WHERE zakaz_tovar.k_tovar In (1,2);

7. Вивести список всіх заказів на товари, ціна яких більша за 3


гривні а кількість в замовленні більше 5 штук.
SELECT zakaz_tovar.K_zakaz, Tovar.Nazva, Tovar.Price,
zakaz_tovar.Kilkist
FROM Tovar INNER JOIN zakaz_tovar ON Tovar.K_tovar =
zakaz_tovar.k_tovar
WHERE (((Tovar.Price)>3) AND ((zakaz_tovar.Kilkist)>5));

8. Самостійно створити запити у відповідності до завдання.


Під’єднати БД у відповідності до індивідуального варіанту.
Визнчити які пошукові запити мають бути корисні користувачу.
Створити запити

14
Вимоги до звітності:
Звіт з лабораторної роботи містить:
1. Тему та мету лабораторної роботи
2. Скріпти самостіно створених запитів до БД «Торгівельна
фірма» та результати їх виконання.
3. Скріпти самостіно створених запитів до БД за
індивідуальним варіантом та результати їх виконання.

15
Лабораторна робота №5.
Тема: Використання SELECT. Запити на вибірку даних
із використанням групування.

Мета роботи: дослідження властивостей DML-інструкції SELECT


для групування даних та відображення проміжних підсумків.
Завдання
1. Виконати запити наведені у ході роботи для БД
«Торгівельна фірма».
2. Створити самостійно наступні запити:
3. вивести загальну кількість товарів на підприємстві.
4. вивести загальну кількість співробітників підприємства.
5. вивести загальну кількість постачальників підприємства.
6. вивести кількість за кожним товаром, що придбані у
поточному місяці.
7. вивести суму, на яку були придбані товари у поточному
місяці.
8. вивести суму продажу товарів за кожним постачальником.
9. вивести загальну кількість замовлень за кожним
постачальником, що продає молоко.
10. вивести середню суму, на яку замовлявся товар.
11. вивести вартість замовлень усіх клієнтів, що мешкають у
Житомирі.
12. вивести середню ціну на товари по кожному постачальнику.
13. Створити для БД «Рейтинг» наступні запити (база даних
додається до лабораторної роботи):

16
14. Сумарний рейтинг студента з кожної дисципліни.
15. Розрахувати кількість студентів у кожній групі.
16. Розрахувати кількість дисциплін за групою.
17. Розрахувати кількість проведених занять у кожній групі.
18. Розрахувати середній бал за групою.
19. Розрахувати середній бал з дисципліни.
20. Розрахувати поточний рейтинг студента з кожної
дисципліни.
21. Відобразити найменший рейтинг студентів з дисципліни.
22. Відобразити найбільший студентський рейтинг з
дисципліни.
23. Розрахувати кількість проведених занять за видами для
кожної дисципліни.
24. Розрахувати кількість груп за кожною спеціальністю.
25. Створити запити до БД у відповідності до індивідуального
завдання.
Хід роботи
1. Під’єднати БД «Торгівельна фірма».

17
2. Всі запити, наведені у завданні, реалізуються у базі даних
«Торговельна фірма», створеній на лабораторній роботі № 3.
3. Створити представлення для збереження алгоритму
розрахунку загальної вартості замовлених товарів. Назва
представлення – «QResult».
CREATE VIEW qresult AS
SELECT zakaz_tovar.K_zakaz, klient.Nazva, zakaz_tovar.k_tovar,
zakaz_tovar.Kilkist, zakaz_tovar.Znigka, Tovar.Price*zakaz_tovar.Kilkist*(1-
zakaz_tovar.Znigka) AS Zag_vartist
FROM (klient INNER JOIN zakaz ON klient.K_klient = zakaz.K_klient) INNER
JOIN (Tovar INNER JOIN zakaz_tovar ON Tovar.K_tovar =
zakaz_tovar.k_tovar) ON zakaz.K_zakaz = zakaz_tovar.K_zakaz;

4. Розрахувати загальну вартість всіх замолень. Назва


представлення – «Qresult2».

18
CREATE VIEW qresult2 AS
SELECT QResult.K_zakaz, klient.Nazva, zakaz.date_naznach,
Sum(QResult.Zag_vartist) AS Itog
FROM (klient INNER JOIN zakaz ON klient.K_klient=zakaz.K_klient) INNER JOIN
QResult ON zakaz.K_zakaz=QResult.K_zakaz
GROUP BY QResult.K_zakaz, klient.Nazva, zakaz.date_naznach;

5. Вивести середню вартість замовлення по кожному


співробітнику:
SELECT sotrudnik.Fname, sotrudnik.Name, sotrudnik.Posada,
Avg(QResult2.Itog) AS [Avg-Itog]
FROM (sotrudnik INNER JOIN zakaz ON sotrudnik.K_sotrud=zakaz.k_sotrud)
INNER JOIN QResult2 ON zakaz.K_zakaz=QResult2.K_zakaz
GROUP BY sotrudnik.Fname, sotrudnik.Name, sotrudnik.Posada;

6. Вивести дані про 3 замовлення з найбільшою сумою:


SELECT sotrudnik.Fname, sotrudnik.Name, sotrudnik.Posada,
Avg(QResult2.Itog) AS [Avg-Itog]
FROM (sotrudnik INNER JOIN zakaz ON sotrudnik.K_sotrud=zakaz.k_sotrud)
INNER JOIN QResult2 ON zakaz.K_zakaz=QResult2.K_zakaz
GROUP BY sotrudnik.Fname, sotrudnik.Name, sotrudnik.Posada;

7. Вивести загальну вартість замовлень за клієнтами:


SELECT klient.Nazva, Sum(QResult.Zag_vartist) AS [Sum-Zag_vartist]
FROM (klient INNER JOIN zakaz ON klient.K_klient = zakaz.K_klient) INNER
JOIN QResult ON zakaz.K_zakaz = QResult.K_zakaz
GROUP BY klient.Nazva;

8. Вивести для кожного товару найбільшу суму, на яку він був

19
придбаний.
SELECT Tovar.Nazva, Max((Tovar.Price*zakaz_tovar.Kilkist*(1-
zakaz_tovar.Znigka))) AS Zag_vartist
FROM Tovar INNER JOIN zakaz_tovar ON Tovar.K_tovar=zakaz_tovar.k_tovar
GROUP BY Tovar.Nazva;

9. Розрахувати загальну кількість замовлень за кожним


співробітником.
SELECT sotrudnik.Fname, sotrudnik.Name, sotrudnik.Posada,
Count(zakaz.K_zakaz) AS [Count-K_zakaz]
FROM zakaz INNER JOIN sotrudnik ON zakaz.k_sotrud = sotrudnik.K_sotrud
GROUP BY sotrudnik.Fname, sotrudnik.Name, sotrudnik.Posada;

10. Для БД «Torg_Firm « сформувати такі запити:


– Вивести загальну кількість товарів на підприємстві.
– Вивести загальну кількість співробітників підприємства.
– Вивести загальну кількість постачальників підприємства.
– Вивести кількість за кожним товаром, що придбані у
поточному місяці.
– Вивести суму, на яку були придбані товари у поточному
місяці.
– Вивести суму продажу товарів за кожним постачальником.
– Вивести загальну кількість замовлень за кожним
постачальником, що продає молоко.
– Вивести середню суму, на яку замовлявся товар.
– Вивести вартість замовлень усіх клієнтів, що мешкають у

20
Житомирі.
– Вивести середню ціну на товари по кожному
постачальнику.

– Для БД «Рейтинг» сформувати такі запити:
– Сумарний рейтинг студента з кожної дисципліни.
– Розрахувати кількість студентів у кожній групі.
– Розрахувати кількість дисциплін за групою.
– Розрахувати кількість проведених занять у кожній групі.
– Розрахувати середній бал за групою.
– Розрахувати середній бал з дисципліни.
– Розрахувати поточний рейтинг студента з кожної
дисципліни.
– Відобразити найменший рейтинг студентів з дисципліни.
– Відобразити найбільший студентський рейтинг з
дисципліни.
– Розрахувати кількість проведених занять за видами для
кожної дисципліни.
– Розрахувати кількість груп за кожною спеціальністю.
– Вимоги до звітності:
– Звіт з лабораторної роботи містить:
1. Тему та мету лабораторної роботи
2. Скріпти самостіно створених запитів до БД «Торгівельна
фірма» та результати їх виконання.
3. Скріпти самостійно створених запитів до БД «Рейтинг» та

21
результати їх виконання
4. Скріпти самостіно створених запитів до БД за
індивідуальним варіантом та результати їх виконання.

22
Лабораторна робота №6.

Тема: Додаткові можливості обробки даних. Запити на


модифікацію даних

Мета: дослідження властивостей DML-інструкції SELECT для


групування дани та відображення проміжних підсумків
Обладнання: ПЕОМ, MS SQL
Теоретичні відомості

Хід роботи
Всі запити, наведені у завданні, реалізуються у базі даних
«Торговельна фірма», створеній на лабораторному занятті 3.
1. Вивести список постачальників, які мешкають в одному
місті з клієнтами. Переглянути, як зміниться запит, якщо умову
«=« змінити на «<>«.
SELECT Klient.Nazva, Postachalnik.Nazva
FROM Klient, Postachalnik
WHERE Klient.City=Postachalnik.City;
2. Вивести список товарів, ціна на які вища за середню.
SELECT Tovar.Nazva
FROM Tovar
WHERE (Tovar.Price>(SELECT AVG (Price)
FROM Tovar));
3. Вивести список товарів, які було продано зі знижкою

23
більше 5%.
SELECT *
FROM Tovar
WHERE K_tovar IN (SELECT K_tovar FROM Zakaz_tovar
WHERE Znigka >=0.05);
4. Вставити в таблицю «Tovar» (див. рис. 1.19) відомості про
новий товар.
INSERT INTO Tovar ( K_tovar, Nazva, Price, K_postav )
VALUES (25, ‘Кефір’, 12.5, 1);
5. Вставити в таблицю «Klient» всіх постачальників, що
мешкають у Житомирі.
INSERT INTO Klient ( nazva )
SELECT Nazva
FROM Postachalnik
WHERE Postachalnik.city=‘Житомир’;
6. Підвищити ціну на товари від постачальника з кодом 
1 на 13%.
UPDATE Tovar SET Price = (1.13*Price)
WHERE K_postav=1;
7. Знищити з таблиці «Tovar» (див. рис. 1.19) запис зі
значенням поля K_tovar=25.
DELETE *
FROM Tovar
WHERE K_tovar=25;
8. Знищити з таблиці «Zakaz» (див. рис. 1.20) всі замовлення

24
від клієнта із зазначеною назвою.
DELETE *
FROM Zakaz
WHERE K_klient=(SELECT K_klient FROM Klient
WHERE Nazva = [Введіть назву клієнта]);
9. Вивести одночасно відомості про всіх партнерів фірми:
SELECT Postachalnik.Nazva, Postachalnik.City,
Postachalnik.Adress
FROM Postachalnik
UNION
SELECT Klient.Nazva, Klient.City, Klient.Adress
FROM Klient;
10. Побудувати запит з параметрами, який виводить
відомості про товари, замовлені після вказаної дати та з ціною, що
перевищує задану.
CREATE PROCEDURE proc1
@min as decimal(10,4), @date_begin as DateTime
AS
SELECT zakaz_tovar.K_zakaz, zakaz.date_rozm, tovar.price,
zakaz_tovar.kilkist
FROM zakaz INNER JOIN (Tovar INNER JOIN zakaz_tovar
ON Tovar.K_tovar=zakaz_tovar.k_tovar)
ON zakaz.K_zakaz=zakaz_tovar.K_zakaz
WHERE tovar.price>@min And zakaz.date_rozm>=@date_begin;

25
Go
execute mu_proc @min=0.5, @date_begin='01.01.2014'

Завдання на самостійну роботу


Побудувати запити до БД «Рейтинг»:
1. Запит на знищення даних з таблиці «Reiting» за визначеним
кодом студента (в поле параметра вводиться прізвище студента).
2. Запит на знищення даних з таблиці «Para» за визначеним
кодом дисципліни (у поле параметра вводиться назва дисципліни).
3. Запит на оновлення даних у таблиці «Reiting» –
передбачити збільшення балів за модульні контролі на 15%.
4. Запит на оновлення даних в таблиці «Reiting»– передбачити
зменшення балів за іспит на 15%.
5. Запит на вставку даних до таблиці «Reiting» – передбачити
вставку даних студентів визначеної групи (код пари та початковий
бал задається динамічно).
6. Запит на вставку даних до таблиці «Para» – передбачити
вставку всіх дисциплін, назва яких починається з літери «М» (дата
заняття та години задаються динамічно, однакові для всіх).
7. Запит на оновлення даних – передбачити зміну порядкового
номера змістовного модуля за певною дисципліною на нове
значення.
8. Передбачити знищення студентів з таблиці «Students» за
визначеним номером групи.
9. Запит на вставку даних до таблиці «Reiting» – передбачити
вставку даних студентів визначеної групи (код пари та присутність
задаються динамічно)
10. Передбачити оновлення даних у таблиці «Reiting»  поле
«Prisutnist», для студента із визначеним прізвищем автоматично
встановлюється true.

Для БД за індивідуальним завданням реалізувати:


1. Запити на вставку та оновлення даних – для одного запису
2. Запит на вставку та оновлення даних - для множини записів

26
(можна створювати додаткові таблиці).
3. Запити на пошук побудовані в лабораторній роботі № 3
модіфікувати на запити із параметрами що змінюються
динамічно.
Вимоги до звітності:
Звіт з лабораторної роботи містить:
1. Тему та мету лабораторної роботи
2. Скріпти самостійно створених запитів до БД «Рейтинг» та
результати їх виконання
3. Скріпти самостіно створених запитів до БД за
індивідуальним варіантом та результати їх виконання.

27
Лабораторна робота №7.

Тема: Процедури, що зберігаються. Тригери


Мета: дослідження властивостей та можливостей процедур, що
зберігаються та тригерів
Обладнання: ПЕОМ, MS SQL
Теоретичні відомості

Хід роботи
1. Розробити процедуру для отримання назв і вартості товарів,
проданих визначеним співробітником.
CREATE PROC my_proc1 AS
SELECT Tovar.Nazva,
tovar.Price*zakaz_tovar.Kilkist
AS Vartist, sotrudnik.Fname,
sotrudnik.Name FROM sotrudnik INNER
JOIN
( (tovar INNER JOIN zakaz_tovar ON
tovar.K_tovar=zakaz_tovar.k_tovar) inner join zakaz on
zakaz.K_zakaz=zakaz_tovar.K_zakaz ON
sotrudnik.K_sotrud=zakaz.k_sotrud WHERE sotmdnik.Name-
Eaana'
Для звернення до процедури можна використовувати команди:
EXEC my_proc1 або my_proc1 Процедура повертає
набір даних.

2. Створити процедуру для зменшення ціни товару


постачальника ПП "Арей" на 10%.

CREATE PROC my_proc2 AS

28
UPDATE tovar SET Price=Price*0.9
WHERE K_postav=(select postachalnik.K_postach from postachalnik
where postachalnik.Nazva='nn "Арей"')
Для звернення до процедури можна використовувати команди:
EXEC my_proc2 або my_proc2 Процедура не повертає ніяких даних.

3. Створити процедуру для отримання назв і вартості товарів, які


придбав заданий клієнт.
CREATE PROC my_proc3 @k VARCHAR(20)
AS
SELECT tovar.Nazva,
tovar.Price*zak
az_tovar.Kilkist AS
vartist, klient.Nazva
FROM klient INNER
JOIN ( (tovar INNER
JOIN zakaz_tovar ON
tovar.K_tovar=zakaz_to
var.k_tovar) inner join
zakaz on
zakaz.K_zakaz=zakaz_tovar.K
_zakaz ON
klient.K_klient=zakaz.K_klient
WHERE klient.Nazva=@k
)
Для звернення до процедури можна використовувати команди:
EXEC my_proc3 'Іванов' або my_proc3 @k='Іванов'

4. Створити процедуру для зменшення ціни товару з певним


запасом відповідно до вказаного %.
CREATE PROC my_proc4
@t
VARCHAR(20),
@p FLOAT AS
UPDATE tovar SET Price=Price*(1 -@p)
WHERE Min_zapas=@t
Для звернення до процедури можна використовувати команди:

29
EXEC my_proc4 'Вафлі', 0.05 або EXEC my_proc4
@t='Вафлі', @p=0.05

5. Створити процедуру для зменшення ціни товару заданого типу


відповідно до вказаного %.

CREATE PROC my_proc5


@t VARCHAR(20)-’Цукерки"
@p
FLOAT=0.1 AS
UPDATE tovar SET Price=Price*(1 -@p)
WHERE NaSklade=@t
Для звернення до процедури можна використовувати команди:
EXEC my_proc5 'Вафлі', 0.05 або EXEC my_proc5
@t='Вафлі', @p=0.05 або EXEC my_proc5 @p=0.05
В цьому випадку зменшується ціна цукерок (значення типу не
вказане при виклику процедури і береться за умовчанням).
EXEC my_proc5
У останньому випадку обидва параметри (і тип, і відсотки) не
вказано при виклику процедури, їх значення беруться за
умовчанням.

6. Створити процедуру для визначення загальної вартості


товарів, проданих за конкретний місяць.

CREATE PROC my_proc6 @m INT


@s FLOAT
OUTPUT AS
SELECT @s=Sum(tovar.Price*zakaz_tovar.Kilkist)
FROM tovar INNER
JOIN zakaz_tovar ON
tovar.K_tovar=zakaz_
tovar.k_tovar inner
join zakaz on

30
zakaz.K_zakaz=zakaz
_tovar.K_zakaz
GROUP BY Month(zakaz.date_naznach)
HAVING Month(zakaz.date_naznach)=@m
Для звернення до процедури можна
використовувати команди:
DECLARE @st FLOAT EXEC my_proc6 1
,@st OUTPUT SELECT @st
Цей блок команд дозволяє визначити вартість товарів, проданих в
січні ( вхідний параметр місяць вказаний рівним 1).

7. Створити процедуру для визначення загальної кількості


товарів, придбаних фірмою, в якій працює заданий
співробітник.
Спочатку розробимо процедуру для визначення міста,
де працює клієнт.
CREATE PROC my_proc7 @n VARCHAR(20)
@f VARCHAR(20) OUTPUT AS
SELECT @f=City FROM klient WHERE Nazva=@n
- Використання вкладених процедур. Створити процедуру для
визначення загальної кількості товарів, придбаних фірмою, в якій
працює заданий співробітник.

- Потім створимо процедуру, що підраховує загальну


кількість товару, який куплений фірмою, що цікавить нас.
CREATE PROC my_proc8 @fam VARCHAR(20)
@kol INT OUTPUT AS
DECLARE @city VARCHAR(20)
EXEC my_proc7 @fam,@city OUTPUT SELECT
@kol=Sum(zakaz_tovar.Kilkist)
FROM klient INNER JOIN zakaz ON
klient.K_klient=zakaz.K_klient inner join zakaz_tovar

31
on zakaz.K_zakaz=zakaz_tovar.K_zakaz GROUP BY
klient.City HAVING klient.City=@city
Виклик процедури здійснюється за допомогою команди:
DECLARE @k INT
EXEC my_proc8 'Г ермес',@k OUTPUT SELECT @k
8. Використання тригера для реалізації обмежень на значення. У
записі, що додається в таблицуZakaz_tovar, кількість проданого
товару має бути не більше, ніж його залишок з таблиці Склад.

Команда вставки запису в таблицю Zakaz_tovar може бути,


наприклад, такий: INSERT INTO zakaz_tovar(K_zakaz, k_tovar,
Kilkist, Znigka)
VALUES (3,1,25, 0.05)
Створюваний тригер повинен відреагувати на її виконання
таким чином: необхідно відмінити команду, якщо в таблиці Склад
величина залишку товару виявилася менше кількості товару, що
продавалася, з введеним кодом (в прикладі код товару=3.
Представлений тригер налаштований на обробку тільки одного
запису, що додається.
CREATE TRIGGER trig_ins ON zakaz_tovar FOR INSERT AS
IF @@ROWCOUNT=1 BEGIN
IF NOT EXISTS(SELECT *
FROM inserted
WHERE -
inserted.Kilkist<=ALL(SELEC
T tovar.NaSklade FROM tovar,
zakaz_tovar WHERE
tovar.K_tovar=
zakaz_tovar.k_tovar))
BEGIN
ROLLBACK TRAN
PRINT
' 'Нема товару'

32
END
END
При продажі або отриманні товару необхідно відповідним
чином змінити кількість його складського запасу. Якщо товару на складі
ще немає, необхідно додати відповідний запис в таблицю Склад. Тригер
обробляє тільки один рядок, що додається.

ALTER TRIGGER trig_ins ON zakaz_tovar FOR INSERT AS


DECLARE @x INT, @y INT IF @@ROWCOUNT=1 BEGIN
IF NOT EXISTS(SELECT *
FROM inserted WHERE - inserted.Kilkist<
=ALL(SELECT tovar.NaSklade
FROM tovar,
zakaz_tovar WHERE
tovar.K_tovar=
zakaz_tovar.
k_tovar))
BEGIN
ROLLBACK TRAN
PRINT 'Нестача
товару'
END
IF NOT EXISTS (
SELECT i.k_tovar,
i.Kilkist, 2 FROM tovar
N, inserted i
WHERE N. k_tovar
=i.k_tovar)
INSERT INTO tovar (K_tovar, NaSklade,
K_postav) ELSE BEGIN
SELECT @y=i.k_tovar, @x=i.Kilkist FROM zakaz_tovar
N, inserted i WHERE N.k_tovar=i.k_tovar UPDATE tovar
SET NaSklade=NaSklade+@x WHERE K_tovar=@y
END
END

10. Створити тригер для обробки операції видалення запису з


таблиці Zakaz_tovar, наприклад, такої команди:

33
DELETE FROM Zakaz_tovar WHERE K_zakaz=4 Для товару, код
якого вказаний при видаленні запису, необхідно відкоригувати
його залишок на складі. Тригер обробляє тільки один запис, що
видаляється.
CREATE TRIGGER ааа_del ON zakaz_tovar FOR DELETE AS
IF @@ROWCOUNT=1 BEGIN DECLARE @y INT,@x INT SELECT
@y=k_tovar, @x=Kilkist FROM deleted UPDATE tovar SET
NaSklade=NaSklade -@x WHERE K_tovar=@y
END

11. Створити тригер для обробки операції зміни запису в


таблиці, наприклад, такою командою:
UPDATE zakaz_tovar SET Kilkist=Kilkist - 10 WHERE k tovar=3 у
усіх угодах з товаром, що має код, рівний 3, зменшити кількість
товару на 10 одиниць.
Вказана команда може привести до зміни відразу декількох
записів в таблиці Zakaz_tovar. Тому покажемо, як створити тригер,
оброблювальний не один запис. Для кожного зміненого запису
необхідно для старого (до зміни) коду товару зменшити залишок
товару на складі на величину старої (до зміни) кількості товару і
для нового (після зміни) коду товару збільшити його залишок на
складі на величину нового (після зміни) значення. Щоб обробити
усі змінені записи, введемо курсори, в яких збережемо усі старі (з
таблиці deleted ) і усі нові значення (з таблиці inserted ).
CREATE TRIGGER trig_upd ON zakaz_tovar FOR UPDATE AS
DECLARE @x INT, @x_old INT, @y INT, @y_old INT DECLARE
CUR1 CURSOR FOR SELECT k_tovar, kilkist FROM inserted
DECLARE CUR2 CURSOR FOR SELECT k_tovar, kilkist FROM deleted
OPEN CUR1 OPEN CUR2

34
FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM
CUR2 INTO @x_old, @y_old WHILE @@FETCH_STATUS=0
BEGIN
UPDATE tovar
SET NaSklade=NaSklade -@y_old WHERE K_tovar=@x_old IF
NOT EXISTS (SELECT * FROM tovar WHERE K_tovar=@x)
INSERT INTO tovar(K_tovar, NaSklade)
VALUES (@x,@y)
ELSE
UPDATE tovar
SET NaSklade=NaSklade+@y
WHERE K_tovar=@x
FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT
FROM CUR2 INTO @x_old, @y_old END
CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE
CUR2
У розглянутому тригері відсутнє порівняння кількості
товару при зміні запису про угоду з його залишком на складі.
Змінемо тригер. Для генерування повідомлення про помилку
використовуємо в тілі тригера команду MS SQL Server
RAISERROR, аргументами якої є текст повідомлення, рівень
серйозності і статус помилки.
ALTER
TRIGGER
trig_upd ON
zakaz_tovar
FOR
UPDATE
AS
DECLARE @x INT, @x_old INT, @y INT,
@y_old INT,@o INT
DECLARE CUR1 CURSOR FOR
SELECT k_tovar, kilkist FROM
inserted
DECLARE
CUR2
CURSOR FOR

35
SELECT
k_tovar, kilkist
FROM deleted
OPEN CUR1
OPEN CUR2
FETCH NEXT FROM CUR1 INTO
@x, @y FETCH NEXT FROM CUR2
INTO @x_old, @y_old WHILE
@@FETCH_STATUS=0 BEGIN
SELECT @o=NaSklade
FROM tovar WHERE
K_tovar=@x IF @o<-
@y BEGIN
RAISERROR('відкіт ', 16,10)
CLOSE
CUR1
CLOSE
CUR2
DEALLOCA
TE CUR1
DEALLOCA
TE CUR2
ROLLBACK
TRAN
RETURN
END
UPDATE tovar
SET NaSklade=NaSklade
-@y_old WHERE K_tovar=@x_old IF
NOT EXISTS (SELECT * FROM
tovar WHERE K_tovar=@x)
INSERT INTO tovar(K_tovar, NaSklade)
VALUES (@x,@y)
ELSE
UPDATE tovar
SET NaSklade=NaSklade+@y
WHERE K_tovar=@x
FETCH NEXT FROM CUR1 INTO @x,
@y FETCH NEXT FROM CUR2 INTO @x_old,
@y_old END

36
CLOSE CUR1 CLOSE
CUR2 DEALLOCATE
CUR1 DEALLOCATE
CUR2
12. У прикладі відбувається відміна усіх змін при
неможливості реалізувати хоч би одне з них. Створимо тригер, що
дозволяє відміняти зміну тільки деяких записів і виконувати зміну
інших.

В цьому випадку тригер виконується не після зміни записів, а


замість команди зміни.
ALTER TRIGGER trig_upd
ON zakaz_tovar INSTEAD OF UPDATE
AS
DECLARE @k INT, @k_old INT DECLARE @x INT, @x_old INT, @y
INT DECLARE @y_old INT,@o INT DECLARE CUR1 CURSOR FOR
SELECT k_zakaz, k_tovar, kilkist FROM inserted
DECLARE CUR2 CURSOR FOR SELECT k_zakaz, k_tovar, kilkist FROM
deleted OPEN CUR1 OPEN CUR2
FETCH NEXT FROM CUR1 INTO @k,@x, @y FETCH NEXT
FROM CUR2 INTO @k_old,@x_old @y_old
WHILE @@FETCH_STATUS=0 BEGIN
SELECT @o=NaSklade FROM tovar WHERE K_tovar=@x IF
@o>=-@y BEGIN
RAISERROR(,зміна ', 16,10)
UPDATE zakaz_tovar SET Kilkist=@y, k_tovar=@x WHERE
K_zakaz=@k UPDATE tovar
SET NaSklade=NaSklade -@y_old WHERE K_tovar=@x_old
IF NOT EXISTS (SELECT * FROM tovar WHERE
K_tovar=@x)
INSERT INTO tovar(K_tovar, NaSklade) VALUES (@x,@y)
ELSE
UPDATE tovar SET NaSklade=NaSklade+@y WHERE
K_tovar=@x END ELSE
RAISERROR('запис не змінено', 16,10)
FETCH NEXT FROM CUR1 INTO @k,@x, @y FETCH NEXT
FROM CUR2 INTO @k_old,@x_old @y_old

37
END
CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2

Завдання на самостійну роботу


1. Реалізувати тригери для обробки подій таблиці Zakza
2. Реаляізувати функцію визначення знидки в залежності від
кількості товару.
3. Побудувати до БД «Рейтинг» процедури, що зберігаються:
4. Розрахунок середнього бала студентів за період – без
урахування перездач.
5. Розрахунок середнього бала студентів за період – з
урахування перездач.
6. Визначення студентів, що навчаютьяс на 4 та 5.
7. Процедура виводить суму балів та її значення в
національній системі та ECTS.
8. Тригер на вставку даних в таблицю студент – якщо код
групи новий в таблицю додаэться група.
9. Тригер на модифікацію даних з таблиці студенти якщо
більше немає студентів в групі група знищується.

10. Для БД за індивідуальним завданням реалізувати:


11. Процедури, що зберігаються - не менше 3 (для запитів на
пошук бов’язково).
12. Тригери для таблиць.
Вимоги до звітності:
Звіт з лабораторної роботи містить:

38
1. Тему та мету лабораторної роботи
2. Скріпти самостіно процедур, що зберігаютсья БД
«Торгівельна фірма» та результати їх виконання.
3. Скріпти самостійно створених процедур та тригерів до БД
«Рейтинг» та результати їх виконання
4. Скріпти самостіно створених процедур та тригерів до БД за
індивідуальним варіантом та результати їх виконання.

39
40

You might also like