###############################################
###############   Завдання    #################
###############################################

################################################
###############   Завдання 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%';