Files
sql_advanced/lab2-11/task.sql
T
Vitalii Litvinchuk 6deed0469a first commit
2026-05-04 23:15:09 +03:00

115 lines
5.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
###############################################
############### Завдання #################
###############################################
################################################
############### Завдання 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%';