115 lines
5.6 KiB
SQL
115 lines
5.6 KiB
SQL
###############################################
|
||
############### Завдання #################
|
||
###############################################
|
||
|
||
################################################
|
||
############### Завдання 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%'; |