feat: test 9-12
Advanced SQL Quality Check / Lint SQL Scripts (push) Failing after 18s

This commit is contained in:
Vitalii Litvinchuk
2026-05-06 23:35:17 +03:00
parent 9884d8e5af
commit 0d93a18aad
10 changed files with 838 additions and 0 deletions
+535
View File
@@ -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"
);
+36
View File
@@ -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);
+43
View File
@@ -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;
+58
View File
@@ -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;
+23
View File
@@ -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;
+33
View File
@@ -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. Здійсніть вивід та порівняйте з виводом початкового запиту
+23
View File
@@ -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
+36
View File
@@ -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");
+34
View File
@@ -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;
+17
View File
@@ -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:
##################################################
###############################################
############### Завдання #################
###############################################