From 0d93a18aad7ef1dff5005f5e3b6e7fa3e1e6a958 Mon Sep 17 00:00:00 2001 From: Vitalii Litvinchuk Date: Wed, 6 May 2026 23:35:17 +0300 Subject: [PATCH] feat: test 9-12 --- lab9-12-test/abo.sql | 535 +++++++++++++++++++++++++++++++++++++++++ lab9-12-test/task1.sql | 36 +++ lab9-12-test/task2.sql | 43 ++++ lab9-12-test/task3.sql | 58 +++++ lab9-12-test/task4.sql | 23 ++ lab9-12-test/task5.sql | 33 +++ lab9-12-test/task6.sql | 23 ++ lab9-12-test/task7.sql | 36 +++ lab9-12-test/task8.sql | 34 +++ lab9-12-test/tasks.sql | 17 ++ 10 files changed, 838 insertions(+) create mode 100644 lab9-12-test/abo.sql create mode 100644 lab9-12-test/task1.sql create mode 100644 lab9-12-test/task2.sql create mode 100644 lab9-12-test/task3.sql create mode 100644 lab9-12-test/task4.sql create mode 100644 lab9-12-test/task5.sql create mode 100644 lab9-12-test/task6.sql create mode 100644 lab9-12-test/task7.sql create mode 100644 lab9-12-test/task8.sql create mode 100644 lab9-12-test/tasks.sql diff --git a/lab9-12-test/abo.sql b/lab9-12-test/abo.sql new file mode 100644 index 0000000..dc51a5b --- /dev/null +++ b/lab9-12-test/abo.sql @@ -0,0 +1,535 @@ +DROP DATABASE Lucky_Shrub; + +CREATE DATABASE IF NOT EXISTS Lucky_Shrub; + +USE Lucky_Shrub; + +CREATE TABLE Clients ( + ClientID VARCHAR(10) primary key, + FullName VARCHAR(100), + ContactNumber INT, + AddressID INT +); + +CREATE TABLE Products ( + ProductID VARCHAR(10) primary key, + ProductName VARCHAR(100), + BuyPrice DECIMAL(6, 2), + SellPrice DECIMAL(6, 2), + NumberOfItems INT +); + +Create table Addresses ( + AddressID INT PRIMARY KEY, + Street VARCHAR(255), + County VARCHAR(100) +); + +CREATE TABLE Employees ( + EmployeeID INT primary key, + FullName VARCHAR(100), + JobTitle VARCHAR(50), + Department VARCHAR(200), + AddressID INT +); + +CREATE TABLE Activity ( + ActivityID INT PRIMARY KEY, + Properties JSON +); + +CREATE TABLE Audit ( + AuditID INT AUTO_INCREMENT PRIMARY KEY, + OrderDateTime TIMESTAMP NOT NULL +); + +CREATE TABLE Orders ( + OrderID INT NOT NULL PRIMARY KEY, + ClientID VARCHAR(10), + ProductID VARCHAR(10), + Quantity INT, + Cost DECIMAL(6, 2), + Date DATE, + FOREIGN KEY (ClientID) REFERENCES Clients (ClientID), + FOREIGN KEY (ProductID) REFERENCES Products (ProductID) +); + +CREATE TABLE Notifications ( + NotificationID INT AUTO_INCREMENT PRIMARY KEY, + Notification VARCHAR(256), + DateTime TIMESTAMP NOT NULL +); + +INSERT INTO + Employees ( + EmployeeID, + FullName, + JobTitle, + Department, + AddressID + ) +VALUES ( + 1, + "Seamus Hogan", + "Manager", + "Management", + 7 + ), + ( + 2, + "Thomas Eriksson", + "Assistant ", + "Sales", + 8 + ), + ( + 3, + "Simon Tolo", + "Head Chef", + "Management", + 9 + ), + ( + 4, + "Francesca Soffia", + "Assistant ", + "Human Resources", + 10 + ), + ( + 5, + "Emily Sierra", + "Accountant", + "Finance", + 11 + ), + ( + 6, + "Greta Galkina", + "Accountant", + "Finance", + 12 + ); + +INSERT INTO + Activity (ActivityID, Properties) +VALUES ( + 1, + '{ "ClientID": "Cl1", "ProductID": "P1", "Order": "True" }' + ), + ( + 2, + '{ "ClientID": "Cl2", "ProductID": "P4", "Order": "False" }' + ), + ( + 3, + '{ "ClientID": "Cl5", "ProductID": "P5", "Order": "True" }' + ); + +INSERT INTO + Clients ( + ClientID, + FullName, + ContactNumber, + AddressID + ) +VALUES ( + "Cl1", + "Takashi Ito", + 351786345, + 1 + ), + ( + "Cl2", + "Jane Murphy", + 351567243, + 2 + ), + ( + "Cl3", + "Laurina Delgado", + 351342597, + 3 + ), + ( + "Cl4", + "Benjamin Clauss", + 351342509, + 4 + ), + ( + "Cl5", + "Altay Ayhan", + 351208983, + 5 + ), + ( + "Cl6", + "Greta Galkina", + 351298755, + 6 + ); + +INSERT INTO + Products ( + ProductID, + ProductName, + BuyPrice, + SellPrice, + NumberOfITems + ) +VALUES ( + "P1", + "Artificial grass bags ", + 40, + 50, + 100 + ), + ( + "P2", + "Wood panels", + 15, + 20, + 250 + ), + ( + "P3", + "Patio slates", + 35, + 40, + 60 + ), + ( + "P4", + "Sycamore trees ", + 7, + 10, + 50 + ), + ( + "P5", + "Trees and Shrubs", + 35, + 50, + 75 + ), + ( + "P6", + "Water fountain", + 65, + 80, + 15 + ); + +INSERT INTO + Addresses (AddressID, Street, County) +VALUES ( + 1, + "291 Oak Wood Avenue", + "Graham County" + ), + ( + 2, + "724 Greenway Drive", + "Pinal County" + ), + ( + 3, + "102 Sycamore Lane", + "Santa Cruz County" + ), + ( + 4, + "125 Roselawn Close", + "Gila County" + ), + ( + 5, + "831 Beechwood Terrace", + "Cochise County" + ), + ( + 6, + "755 Palm Tree Hills", + "Mohave County" + ), + ( + 7, + "751 Waterfall Hills", + "Tuscon County" + ), + ( + 8, + "878 Riverside Lane", + "Tuscon County" + ), + ( + 9, + "908 Seaview Hills", + "Tuscon County" + ), + ( + 10, + "243 Waterview Terrace", + "Tuscon County" + ), + ( + 11, + "148 Riverview Lane", + "Tuscon County" + ), + ( + 12, + "178 Seaview Avenue", + "Tuscon County" + ); + +INSERT INTO + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost, + Date + ) +VALUES ( + 1, + "Cl1", + "P1", + 10, + 500, + "2020-09-01" + ), + ( + 2, + "Cl2", + "P2", + 5, + 100, + "2020-09-05" + ), + ( + 3, + "Cl3", + "P3", + 20, + 800, + "2020-09-03" + ), + ( + 4, + "Cl4", + "P4", + 15, + 150, + "2020-09-07" + ), + ( + 5, + "Cl3", + "P3", + 10, + 450, + "2020-09-08" + ), + ( + 6, + "Cl2", + "P2", + 5, + 800, + "2020-09-09" + ), + ( + 7, + "Cl1", + "P4", + 22, + 1200, + "2020-09-10" + ), + ( + 8, + "Cl3", + "P1", + 15, + 150, + "2020-09-10" + ), + ( + 9, + "Cl1", + "P1", + 10, + 500, + "2020-09-12" + ), + ( + 10, + "Cl2", + "P2", + 5, + 100, + "2020-09-13" + ), + ( + 11, + "Cl4", + "P5", + 5, + 100, + "2020-09-15" + ), + ( + 12, + "Cl1", + "P1", + 10, + 500, + "2022-09-01" + ), + ( + 13, + "Cl2", + "P2", + 5, + 100, + "2022-09-05" + ), + ( + 14, + "Cl3", + "P3", + 20, + 800, + "2022-09-03" + ), + ( + 15, + "Cl4", + "P4", + 15, + 150, + "2022-09-07" + ), + ( + 16, + "Cl3", + "P3", + 10, + 450, + "2022-09-08" + ), + ( + 17, + "Cl2", + "P2", + 5, + 800, + "2022-09-09" + ), + ( + 18, + "Cl1", + "P4", + 22, + 1200, + "2022-09-10" + ), + ( + 19, + "Cl3", + "P1", + 15, + 150, + "2022-09-10" + ), + ( + 20, + "Cl1", + "P1", + 10, + 500, + "2022-09-12" + ), + ( + 21, + "Cl2", + "P2", + 5, + 100, + "2022-09-13" + ), + ( + 22, + "Cl2", + "P1", + 10, + 500, + "2021-09-01" + ), + ( + 23, + "Cl2", + "P2", + 5, + 100, + "2021-09-05" + ), + ( + 24, + "Cl3", + "P3", + 20, + 800, + "2021-09-03" + ), + ( + 25, + "Cl4", + "P4", + 15, + 150, + "2021-09-07" + ), + ( + 26, + "Cl1", + "P3", + 10, + 450, + "2021-09-08" + ), + ( + 27, + "Cl2", + "P1", + 20, + 1000, + "2022-09-01" + ), + ( + 28, + "Cl2", + "P2", + 10, + 200, + "2022-09-05" + ), + ( + 29, + "Cl3", + "P3", + 20, + 800, + "2021-09-03" + ), + ( + 30, + "Cl1", + "P1", + 10, + 500, + "2022-09-01" + ); \ No newline at end of file diff --git a/lab9-12-test/task1.sql b/lab9-12-test/task1.sql new file mode 100644 index 0000000..f373057 --- /dev/null +++ b/lab9-12-test/task1.sql @@ -0,0 +1,36 @@ +##################################################### +###################### Task 1: ################## + +1. Створіть фукнцію FindAverageCost(), яка повертає значення середньої ціни продажу всіх продуктів +за певний рік. Рік має вводитися користувачем як вхідний параметр функції. + +2. Запустіть функцію для різних років. +На знімку екрана нижче показано середню вартість, отриману функцією FindAverageCost() +на основі даних користувача за 2022 рік: +https://drive.google.com/open?id=18QemvhMFkhWVARePoW3m0A7cmrtlEvl7&usp=drive_fs + +output table: +FindAverageCost(2022) +value + +select * from Products; + +drop function FindAverageCost; + +create function FindAverageCost(InputYear int) + returns float + deterministic + begin + declare AverageCost float; + + select round(avg(Cost), 2) + into AverageCost + from Orders + where year(Date) = InputYear; + + return AverageCost; + end; + +set @year = 2022; + +select FindAverageCost (@year); \ No newline at end of file diff --git a/lab9-12-test/task2.sql b/lab9-12-test/task2.sql new file mode 100644 index 0000000..0f0b67e --- /dev/null +++ b/lab9-12-test/task2.sql @@ -0,0 +1,43 @@ +##################################################### +###################### Task 2: ################## +1. Створіть збережену процедуру EvaluateProduct, яка дозволить у якості трьох вихідних параметрів +вивести загальну кількість товарів, проданих протягом 2020, 2021, 2022 років відповідно для продукту, + ідентифікатор якого вказує користувач в якості вхідного пераметра процедури. +2. Викличте процедуру вказавши в якості вхідного параметра "P1" та вивівши вихідні параметри у змінні +3. Відобразіть значення змінних з допомогою SELECT. +4. Спробуйте інші вхідні параметри. +На знімку екрана нижче показано загальну кількість товарів, проданих упродовж 2020, 2021, 2022 років + для продукту з ідентифікатором "P1": + https://drive.google.com/open?id=18QndcPAEP6PRhUSI16h_MYx8FAWcM7r_&usp=drive_fs + + output table: + @Sold_Items_2020 | @Sold_Items_2021 | @Sold_Items_2022 + value1 | value2 | value3 + +drop procedure EvaluateProduct; + +create procedure EvaluateProduct(in product_id varchar(10), out sold_2020 int, out sold_2021 int, out sold_2022 int) +begin + select sum(Quantity) into sold_2020 + from Orders + where ProductID = product_id and year(Date) = 2020; + + select sum(Quantity) into sold_2021 + from Orders + where ProductID = product_id and year(Date) = 2021; + + select sum(Quantity) into sold_2022 + from Orders + where ProductID = product_id and year(Date) = 2022; +end; + +set @Sold_Items_2020 = 0, @Sold_Items_2021 = 0, @Sold_Items_2022 = 0; + +call EvaluateProduct ( + 'P2', + @Sold_Items_2020, + @Sold_Items_2021, + @Sold_Items_2022 +); + +select @Sold_Items_2020, @Sold_Items_2021, @Sold_Items_2022; \ No newline at end of file diff --git a/lab9-12-test/task3.sql b/lab9-12-test/task3.sql new file mode 100644 index 0000000..72fa154 --- /dev/null +++ b/lab9-12-test/task3.sql @@ -0,0 +1,58 @@ +##################################################### +###################### Task 3: ################## +1. Створіть тригер під назвою UpdateAudit. Цей тригер має спрацьовувати ПІСЛЯ вставки нового замовлення +в таблицю Orders й додавати запис у таблицю Audit про дату та час замовлення. Поле AuditID заповнювати + не потрібно, оскільки воно заповнюєься автоматично як лічильник. +2. Для перевірки роботи тригера введіть три нових записи у таблицю замовлень за сьогоднішнє число. +3. Виведіть вміст таблиць Orders (за сьогоднішнє число) та Audit. +На наступному знімку екрана показано приклад виводу вмісту таблиць Orders та Audit: +https://drive.google.com/open?id=18QqRc6_XjOJkXUSSKsPadPmakhXQ6U-k&usp=drive_fs + +select * from Audit; + +drop trigger UpdateAudit; + +create trigger UpdateAudit +after insert on Orders +for each row +begin + insert into Audit(`OrderDateTime`) values (now()); +end; + +INSERT INTO + Orders ( + OrderID, + ClientID, + ProductID, + Quantity, + Cost, + Date + ) +VALUES ( + 100, + "Cl1", + "P1", + 10, + 500, + curdate() + ), + ( + 101, + "Cl2", + "P2", + 5, + 100, + curdate() + ), + ( + 102, + "Cl3", + "P3", + 20, + 800, + curdate() + ); + +select * from Orders where Date = curdate(); + +select * from Audit; \ No newline at end of file diff --git a/lab9-12-test/task4.sql b/lab9-12-test/task4.sql new file mode 100644 index 0000000..d3c2f0d --- /dev/null +++ b/lab9-12-test/task4.sql @@ -0,0 +1,23 @@ +##################################################### +###################### Task 4: ################## +1. Створіть оптимізований запит, який виведе інформацію про місцезнаходження клієнтів та співробітників. +У вивід слід включити: +• Повні імена (FullName) всіх клієнтів і співробітників із таблиць Clients і Employees. +• Адресу (Street, County) кожної людини з таблиці адрес. +2. Дані повинні бути впорядковані за назвою вулиці. Зверніть увагу, поле Street починається з +назви будинку а не з назви вулиці. +Результат виводу показаний на наступному скриншоті: +https://drive.google.com/open?id=18SkH6ZmbGctCkWbYtKFcolmmE-v6Nudk&usp=drive_fs + +select * from Clients; + +select FullName, Street, County +from Clients + join Addresses on Clients.AddressID = Addresses.AddressID +union all +select FullName, Street, County +from Employees + join Addresses on Employees.AddressID = Addresses.AddressID +order by SUBSTRING( + Street, LOCATE(' ', Street) + 1 + ) asc; \ No newline at end of file diff --git a/lab9-12-test/task5.sql b/lab9-12-test/task5.sql new file mode 100644 index 0000000..f873ffe --- /dev/null +++ b/lab9-12-test/task5.sql @@ -0,0 +1,33 @@ +##################################################### +###################### Task 5: ################## +Наступний запит повертає загальну кількість дерев’яних панелей (ідентифікатор P2), +проданих в 2020, 2021 і 2022 роках: + +explain + +SELECT CONCAT(SUM(Cost), " (2020)") AS "Total sum of P2 Product" +FROM Orders +WHERE + YEAR(Date) = 2020 + AND ProductID = "P2" +UNION +SELECT CONCAT(SUM(Cost), " (2021)") +FROM Orders +WHERE + YEAR(Date) = 2021 + AND ProductID = "P2" +UNION +SELECT CONCAT(SUM(Cost), " (2022)") +FROM Orders +WHERE + YEAR(Date) = 2022 + AND ProductID = "P2"; + + +Вивід з цього запиту показано на скриншоті нижче: +https://drive.google.com/open?id=18UCCsysObMJhtmc7saumSbN-JkeS5lQW&usp=drive_fs + +1. Оптимізуйте цей запит. + +select + 2. Здійсніть вивід та порівняйте з виводом початкового запиту \ No newline at end of file diff --git a/lab9-12-test/task6.sql b/lab9-12-test/task6.sql new file mode 100644 index 0000000..dce1643 --- /dev/null +++ b/lab9-12-test/task6.sql @@ -0,0 +1,23 @@ +##################################################### +###################### Task 6: ################## +У таблиці Activity реєструється інформація про діяльність клієнтів, які користуються інтернет-магазином, + зокрема ClientID та ProductID для кожної дії в стовпці JSON Properties. Це відбувається, + коли клієнти переглядають продукти в Інтернеті. На наступному скриншоті показано таблицю активності: + https://drive.google.com/open?id=18UUaS39qzfLsIyXuKg0TGzhL3rrivfqR&usp=drive_fs + +1. Напишіть запит, який виведе: +ClientID, ProductID для всіх клієнтів, які виконували дії, повне ім’я (FullName) +та контактний номер (ContactNumber) кожного клієнта з таблиці Клієнти (Clients). +2. Здійсніть вивід запиту + +select + Properties ->> '$.ClientID' as ClientID, + Properties ->> '$.ProductID' as ProductID, + FullName, + ContactNumber +from + Activity + join Clients on Properties ->> '$.ClientID' = Clients.ClientID; + +Результат запиту має відповідати результатам показаним на скриншоті нижче: +https://drive.google.com/open?id=18Vpzx4hWNZ5-5LR7fNnoI9fs93IBXWqD&usp=drive_fs \ No newline at end of file diff --git a/lab9-12-test/task7.sql b/lab9-12-test/task7.sql new file mode 100644 index 0000000..dffce14 --- /dev/null +++ b/lab9-12-test/task7.sql @@ -0,0 +1,36 @@ +##################################################### +###################### Task 7: ################## +1. Створіть збережену процедуру під назвою GetProfit, яка повертає загальний прибуток, отриманий +від певного продукту за певний рік. В якості параметрів процедури користувач повинне ввести значення +для ProductID та року. +Наприклад, результат процедури GetProfit із ProductID="P1" і 2020 роком показано на скриншоті нижче: +https://drive.google.com/open?id=18W3lTIs6yJlSw99k6uq1g5oPhSqLnd63&usp=drive_fs + +set @ProductID = "P1", @year = 2020; + +select * from Products; + +select * from Orders; + +drop procedure GetProfit; + +create procedure GetProfit(in inputYear int, in inputProductId varchar(10)) + begin + declare TotalProfit float default 0; + + select round(sum(SellPrice * Quantity - (BuyPrice * Quantity)), 2) + into TotalProfit + from Orders + join Products on Orders.ProductID = Products.ProductID + where YEAR(Date) = inputYear and Products.ProductID = inputProductId; + + select TotalProfit as profit; + end; + +2. Виведіть значення процедури для кількох різних параметрів. + +call GetProfit ("2020", "P1"); + +call GetProfit ("2020", "P2"); + +call GetProfit ("2020", "P3"); \ No newline at end of file diff --git a/lab9-12-test/task8.sql b/lab9-12-test/task8.sql new file mode 100644 index 0000000..2513cc5 --- /dev/null +++ b/lab9-12-test/task8.sql @@ -0,0 +1,34 @@ +##################################################### +###################### Task 8: ################## +Створіт представлення (VIEW) з назвою DataSummary, яке об’єднає чотири таблиці (Клієнти (Clients), +Адреси (Addresses), Замовлення (Orders), Продукти (Products)). +1. Віртуальна таблиця повинна відображати такі дані: +• Повне ім’я (FullName) та контактний телефон (ContactNumber) для кожного клієнта з таблиці Clients. +• Округ (County), у якому проживає кожен клієнт, з таблиці Addresses. +• Назва продукту (ProductName), який вони придбали в таблиці Products. +• Ідентифікатор продукту (ProductID), вартість (Cost) і дату (Date) кожного замовлення з таблиці Orders. +2. Віртуальна таблиця має: +2.1 відображати відповідні дані лише за 2022 рік. +2.2 впорядковувати вивід даних за вартістю у порядку спадання. +Приклад показано на наступному знімку екрана: +https://drive.google.com/open?id=18WYAMaBZMfHn1et6GUaIANCdzEmWgVZM&usp=drive_fs + +create view DataSummary as +select + FullName, + ContactNumber, + County, + ProductName, + Products.ProductID, + Cost, + Date +from + Clients + join Addresses on Clients.AddressID = Addresses.AddressID + join Orders on Clients.ClientID = Orders.ClientID + join Products on Orders.ProductID = Products.ProductID +where + YEAR(Date) = 2022 +order by Cost desc; + +select * from DataSummary; \ No newline at end of file diff --git a/lab9-12-test/tasks.sql b/lab9-12-test/tasks.sql new file mode 100644 index 0000000..4036902 --- /dev/null +++ b/lab9-12-test/tasks.sql @@ -0,0 +1,17 @@ + +Самостійна 2-9 – 2-12 + +База даних Lucky Shrub складається з таких таблиць: Клієнти (Clients), Замовлення (Orders), Продукти (Products), Адреси (Addresses), Співробітники (Employees), Аудит (Audit), Повідомлення (Notifications) та Діяльність (Activity), як показано на наступній ER-схемі: https://drive.google.com/open?id=18QdwKZFf2nbnRDP__leAWjYNaBaKarNx&usp=drive_fs + +Слід використати MySQL для здійснення бізнес аналітики та оптимізації деяких запитів. + +################################################## +Для виконання роботи Вам потрібна буде база даних Lucky_Shrub із нобором таблиць та даних. +Видаліть якщо є стару базу даних Lucky_Shrub та відновіть її з бекап-версії: https://drive.google.com/open?id=18nJipQRUzjnWikOEVsoleddWgQQis1TJ&usp=drive_fs + +Або ж, для створення/привадення бази даних у початковий стан використайте наступний код в MySQL: +################################################## + +############################################### +############### Завдання ################# +############################################### \ No newline at end of file