first commit

This commit is contained in:
Vitalii Litvinchuk
2026-05-04 23:15:09 +03:00
commit 6deed0469a
49 changed files with 5366 additions and 0 deletions
+115
View File
@@ -0,0 +1,115 @@
###############################################
############### Завдання #################
###############################################
################################################
############### Завдання 1 #################
Для того, щоб швидко вивести інформацію про замовлення було створено такий запит:
SELECT * FROM Orders;
---------------------------------------------------
1. Оптимізуйте даний запит, якщо відомо, що потрібна інформація представлена у полях
OrderID, ProductID, Quantity та Date.
select OrderID, ProductID, Quantity, Date from Orders;
################################################
############### Завдання 2 #################
Для того, щоб вивести замовлення розміщене клієнтом з ідентифікатором Cl1 було створено наступний запис:
SELECT * FROM Orders WHERE ClientID = 'Cl1';
---------------------------------------------------
1. Виконайте наступний запит,
щоб переглянути параметри плану виконання.
EXPLAIN SELECT * FROM Orders WHERE ClientID = 'Cl1';
Значення деяких полів:
type
-- містиь значення ALL, яке свідчить, що для пошуку потрібного значення була просканована уся таблиця.
-- це найгірший тип сканування, який зазвичай вказує на відсутність відповідних індексів у таблиці
possible_keys
-- цей стовпець показує ключі, які може використовувати MySQL для пошуку рядків у таблиці;
-- значення стовпця дорівнює NULL, це означає, що відповідні індекси не знайдено.
key
-- вказує фактичний індекс, який використовує MySQL;
-- у нашому видку стовпець містить значення NULL, яке вказує на те, що в таблиці немає ключів або індексів, які MySQL може використовувати для пошуку або фільтрації рядків
rows
-- кількість опрацьованих рядків для отримання результату
Extra
--Примітки
Ситуацію можна виправити шляхом створення індексу.
---------------------------------------------------
2. З метою оптимізації запиту створіть index з іменем IdxClientID на потрібному полі таблиці Orders.
create index IdxClientID on Orders (ClientID);
drop index IdxClientID on Orders;
---------------------------------------------------
3.Як тільки індекс буде створено, повторно виконайте той же запит SELECT з операторм EXPLAIN.
Порівняйте результати й зробіть висновки.
explain select * from Orders where ClientID = 'Cl1';
################################################
############### Завдання 3 #################
Для пошуку повної інформації про працівника з прізвищем 'Tolo' було написано такий запит:
SELECT * FROM Employees WHERE FullName LIKE '%Tolo';
FullName містить імя та прізвище працівника
Якщо у стовпці FullName є індекс, то запит не зможе його використати, оскільки в умові пропозиції WHERE він містить на початку груповий символ (%).
Для уникнення систуації використання в умові WHERE на початку групового символа (%) виконайте такі кроки:
---------------------------------------------------
1: Додайте новий стовпець ReverseFullName до таблиці Employees.
alter table Employees
add column ReverseFullName varchar(100) default CONCAT(
SUBSTRING_INDEX(FullName, ' ', -1),
' ',
SUBSTRING_INDEX(FullName, ' ', 1)
);
alter table Employees
add column asd integer unique auto_increment primary key;
---------------------------------------------------
2: Заповніть стовпець ReverseFullName значенням з повного імені працівників але у порядку "Прізвище І’мя".
select * from Employees;
update Employees
set
ReverseFullName = CONCAT(
SUBSTRING_INDEX(FullName, ' ', -1),
' ',
SUBSTRING_INDEX(FullName, ' ', 1)
);
---------------------------------------------------
2.1: Перегляньте новостворений стовбець
select ReverseFullName from Employees;
---------------------------------------------------
3: Створіть індекс з іменем IdxReverseFullName на основі стовпця ReverseFullName.
create index IdxReverseFullName on Employees (ReverseFullName);
drop index IdxReverseFullName on Employees;
---------------------------------------------------
4. Перепишіть запит із використанням вже новоствореного стовпця.
select * from Employees where ReverseFullName like 'Tolo%';
explain select * from Employees where ReverseFullName like 'Tolo%';
+316
View File
@@ -0,0 +1,316 @@
SELECT statement optimization in MySQL
Оптимізація пропозиції SELECT
У цій роботі слід застосувати техніки оптимізації запитів на основі оператора SELECT, а також побудувати індекси на основі стовпців для прискорення виконання запитів.
У роботі буде використано базу даних Lucky_Shrub. Слід оптимізувати запити, які звертаються до таблиць працівників (Employees) та замовлень (Orders).
Таблиця Orders містить таку інформацію:
OrderID - ідентифікатор замовлення
ClientID - ідентифікатор клієнта
ProductID - ідентифікатор продукту
Quantity - кількість одиниць продукту
Cost - вартість замовлення
Date - дата кожного замовлення
Таблиця Employees містить таку інформацію
EmployeeID - ідентифікатор працівника
FullName - повне імя працівника (містить, власне, імя та прізвище)
Role - роль працівника
Department - відділ працівника
Передумови
1: Створити базу даних, якщо не створено
CREATE DATABASE Lucky_Shrub;
2: Використати базу даних
USE Lucky_Shrub;
3: Створити таблицю Orders (якщо не створено;
якщо створено, тоді перевірити правильність схеми таблиці)
CREATE TABLE Orders (
OrderID INT NOT NULL,
ClientID VARCHAR(10) DEFAULT NULL,
ProductID VARCHAR(10) DEFAULT NULL,
Quantity INT DEFAULT NULL,
Cost DECIMAL(6, 2) DEFAULT NULL,
Date DATE DEFAULT NULL,
PRIMARY KEY (OrderID)
);
Для перевірки схеми можна використати команду
SHOW CREATE TABLE Orders;
4: Створити таблицю Employees (якщо не створено;
якщо створено, тоді перевірити правильність схеми таблиці)
CREATE TABLE Employees (
EmployeeID INT DEFAULT NULL,
FullName VARCHAR(100) DEFAULT NULL,
Role VARCHAR(50) DEFAULT NULL,
Department VARCHAR(255) DEFAULT NULL
);
Для перевірки схеми можна використати команду
SHOW CREATE TABLE Orders;
5: Вставте дані у таблицю Orders (якщо дані у таблиці є, перевірте чи відповідають вони запропонованим, за потреби підкоригуйте)
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,
"Cl1",
"P2",
15,
80,
"2020-09-12"
),
(
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"
);
5: Імпортуйте дані у таблицю Employees скориставшись файлом MS Excel (https://docs.google.com/spreadsheets/d/14KHqSVEqqvaPXSRSlJdHwMUJlBt6VBtr?rtpof=true&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs). Для цього здійсніть експорт даних у формат csv з екселівського файлу, після чого здійсніть імпорт у таблицю бази даних.
LOAD DATA INFILE '/var/lib/mysql-files/Employees.csv' INTO
TABLE Employees FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (
EmployeeID,
FullName,
Role,
Department,
@dummy
);
Перевірте наявність даних після операції імпорту