Professional Documents
Culture Documents
БД 2
БД 2
Затверджено науково-
методичною
радою ЖДТУ
протокол від
«__»_______ 20__ р.
№__
МЕТОДИЧНІ РЕКОМЕНДАЦІЇ
До лабораторних робот студентів з дисципліни
«_БАЗИ ДАНИХ»
Житомир
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.
ХІД РОБОТИ
3
2. Оновити реєстрацію локального сервера або
зареєструвати новий сервер баз даних (Server
Register…) у вікні „Зареєстровані сервери”.
3. У вікні оглядача об‘єктів виконати під‘єднання до
сервера (рис.3.1).
Рис.3.1.
Створення БД
4
Рис.3.3. Головне вікно БД та редактор запитів
5
Спрощений варіант:
create database torgfirm
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))
Змінити таблицю:
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
7
Лабораторна робота №4.
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;
13
SELECT City, Nazva
FROM Postachalnik
WHERE City LIKE 'К%';
14
Вимоги до звітності:
Звіт з лабораторної роботи містить:
1. Тему та мету лабораторної роботи
2. Скріпти самостіно створених запитів до БД «Торгівельна
фірма» та результати їх виконання.
3. Скріпти самостіно створених запитів до БД за
індивідуальним варіантом та результати їх виконання.
15
Лабораторна робота №5.
Тема: Використання SELECT. Запити на вибірку даних
із використанням групування.
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;
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;
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;
20
Житомирі.
– Вивести середню ціну на товари по кожному
постачальнику.
–
– Для БД «Рейтинг» сформувати такі запити:
– Сумарний рейтинг студента з кожної дисципліни.
– Розрахувати кількість студентів у кожній групі.
– Розрахувати кількість дисциплін за групою.
– Розрахувати кількість проведених занять у кожній групі.
– Розрахувати середній бал за групою.
– Розрахувати середній бал з дисципліни.
– Розрахувати поточний рейтинг студента з кожної
дисципліни.
– Відобразити найменший рейтинг студентів з дисципліни.
– Відобразити найбільший студентський рейтинг з
дисципліни.
– Розрахувати кількість проведених занять за видами для
кожної дисципліни.
– Розрахувати кількість груп за кожною спеціальністю.
– Вимоги до звітності:
– Звіт з лабораторної роботи містить:
1. Тему та мету лабораторної роботи
2. Скріпти самостіно створених запитів до БД «Торгівельна
фірма» та результати їх виконання.
3. Скріпти самостійно створених запитів до БД «Рейтинг» та
21
результати їх виконання
4. Скріпти самостіно створених запитів до БД за
індивідуальним варіантом та результати їх виконання.
22
Лабораторна робота №6.
Хід роботи
Всі запити, наведені у завданні, реалізуються у базі даних
«Торговельна фірма», створеній на лабораторному занятті 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'
26
(можна створювати додаткові таблиці).
3. Запити на пошук побудовані в лабораторній роботі № 3
модіфікувати на запити із параметрами що змінюються
динамічно.
Вимоги до звітності:
Звіт з лабораторної роботи містить:
1. Тему та мету лабораторної роботи
2. Скріпти самостійно створених запитів до БД «Рейтинг» та
результати їх виконання
3. Скріпти самостіно створених запитів до БД за
індивідуальним варіантом та результати їх виконання.
27
Лабораторна робота №7.
Хід роботи
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 Процедура повертає
набір даних.
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 Процедура не повертає ніяких даних.
29
EXEC my_proc4 'Вафлі', 0.05 або EXEC my_proc4
@t='Вафлі', @p=0.05
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).
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, кількість проданого
товару має бути не більше, ніж його залишок з таблиці Склад.
32
END
END
При продажі або отриманні товару необхідно відповідним
чином змінити кількість його складського запасу. Якщо товару на складі
ще немає, необхідно додати відповідний запис в таблицю Склад. Тригер
обробляє тільки один рядок, що додається.
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
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. У прикладі відбувається відміна усіх змін при
неможливості реалізувати хоч би одне з них. Створимо тригер, що
дозволяє відміняти зміну тільки деяких записів і виконувати зміну
інших.
37
END
CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2
38
1. Тему та мету лабораторної роботи
2. Скріпти самостіно процедур, що зберігаютсья БД
«Торгівельна фірма» та результати їх виконання.
3. Скріпти самостійно створених процедур та тригерів до БД
«Рейтинг» та результати їх виконання
4. Скріпти самостіно створених процедур та тригерів до БД за
індивідуальним варіантом та результати їх виконання.
39
40