Академический Документы
Профессиональный Документы
Культура Документы
МЕТОДИЧНІ ВКАЗІВКИ
до практичних занять з дисципліни
«ПРОЕКТУВАННЯ ВИСОКОНАВАНТАЖЕНИХ
СИСТЕМ ЗБЕРІГАННЯ ДАНИХ»
для студентів усіх форм навчання
спеціальності 122 – «Комп’ютерні науки»
за освітньо-професійною програмою
«Комп’ютерні науки та технології»
ЗАТВЕРДЖЕНО
кафедрою системотехніки.
Протокол № 5 від 30.10.2019
Харків 2020
1
1 СТВОРЕННЯ ПРОЦЕДУР І ФУНКЦІЙ ДЛЯ
ВИСОКОНАВАНТАЖЕНИХ БАЗ ДАНИХ НА
ПЛАТФОРМІ СУБД MySQL
2
– синтаксис використання локальних змінних, операторів управління
потоком виконання SQL-коду збережених процедур і функцій (оператори IF,
CASE, LOOP, REPEAT, WHILE, GOTO);
– особливості створення й використання курсорів (Cursors) у
збережених процедурах;
– методику аналізу плану виконання SQL-запитів, що використовуються у
збережених процедурах і функціях, за допомогою оператора EXPLAIN. Вивчити
призначення полів і повідомлень таблиці EXPLAIN;
– індивідуальне завдання (пп. 1.3);
– вивчити теоретичний матеріал базового підручника [2] та відповідні
теми додаткової літератури [3–5].
Виконати:
– завдання самостійних робот №№ 18–19 [1];
– розробку SQL-запитів згідно із завданнями практичного заняття,
підготувати відповідні розділи звіту.
3
заняття № 1 і мати практичний сенс для подальшого використання у зв’язці з
інтерфейсом клієнтської частини високонавантаженої інформаційної системи.
Необхідно розробити такий перелік збережених процедур (функцій):
1.2.1 Розробити збережені функції.
1.2.1.1 Функцію з ім’ям «id_for_surname()», яка повертає id-клієнта
(client.id_client) за його прізвищем, ім’ям, по батькові (surname, name,
middlename). Розробити два варіанти SQL-коду функції, з використанням для
присвоєння локальним змінним:
а) інструкції SELECT ... INTO;
б) інструкції SET.
Надати SQL-код для виклику функції.
1.2.1.2 Функцію з ім’ям «surname_for_order()», яка повертає текстове
значення у форматі: «id – Прізвище Ім’я По батькові» (id_client –
surname name middlename) за заданим ідентифікатором замовлення
(order.id_order). Розробіть для функції три SQL-запиту з використанням:
а) тільки інструкції WHERE;
б) тільки інструкції INER JOIN;
в) вкладеного запиту.
Надати SQL-код для виклику функції. Приклад виведення:
4
б) кількість замовлень зі статусом «виконаний» і загальну суму у форматі:
«Виконано: [кількість замовлень] – [сума у форматі ХХХ,ХХ] грн.». Надати
SQL-код для виклику функції. Приклад виведення:
5
– unit_sum – сумарна кількість товарів без урахування їх найменувань;
– price_sum – загальна сума за всіма замовленнями одного статусу.
Створити три варіанти запитів, у яких для зв’язування таблиць
використовуються :
а) інструкція INNER JOIN. Вибір запиту за статусом замовлення
(ostatus) реалізувати за допомогою оператора IF...THEN...ELSEIF;
б) інструкція WHERE. Вибір запиту за статусом замовлення (ostatus)
реалізувати за допомогою оператора CASE (для першого варіанта синтаксису,
див. пп.1.4.2.1);
в) тільки підзапити. Вибір запиту за статусом замовлення (ostatus)
реалізувати за допомогою оператора CASE (для другого варіанта синтаксису,
див. пп.1.4.2.1). Надати SQL-код для виклику процедури. Приклад виведення:
6
– заповнення tmp_order необхідними даними з базових таблиць
(SQL-запит INSERT ... SELECT).
Надати SQL-код для виклику процедури. Скласти SQL-запити до
тимчасової таблиці tmp_order, що дозволяють отримати:
а) усі записи про замовлення;
б) інформацію про непідтверджені замовлення;
в) інформацію про підтверджені замовлення;
г) інформацію про виконані замовлення.
Приклад вибірки даних таблиці tmp_order представлений на рис. 1.1.
7
замовленнями одного статусу (shop_quantity*product.price). Для циклу
організувати лічильник, встановивши його значення від 1 до ord_count;
– для кожної ітерації циклу, під час одержання значень курсору
(shopping_cart.shop_quantity, product.price) і значень сум unit_sum,
price_sum, занести їх у тимчасову таблицю tmp_cursor.
Надати SQL-код для виклику процедури cursor_order_sum() і вибірку
всіх даних з тимчасової таблиці tmp_cursor.
Приклад вибірки
з таблиці:
Приклад виведення
даних процедури:
8
1.2.2.6 Використовуючи SQL-код процедури add_order(), розробити
процедуру add_order_id(), що забезпечує додавання пунктів кошика
замовлення в таблицю shopping_cart. Вхідні параметри процедури:
– параметр idclient – id-клієнта (таблиця client, поле id_client);
– параметр idproduct – id-найменування товару (таблиця product,
поле id_product);
– параметр shquantity – кількість товару (таблиця shopping_cart,
поле shop_quantity);
– параметр idorder – номер замовлення (таблиця order, поле
id_order).
Процедура add_order_id(), має забезпечувати таку саму перевірку й
модифікацію даних, як і add_order() (див. пп.1.2.2.5).
9
# тіло процедури
routine_body;
END $$
DELIMITER;
Для застосовування інструкції CREATE PROCEDURE використовуються такі
правила, позначення й інструкції мови SQL:
– ідентифікатор sp_name – ім’я збереженої процедури (Stored
Procedures);
–за замовчуванням кожен параметр збереженої процедури є: з
ідентифікатором IN – вхідним, з ідентифікатором OUT – вихідним;
з ідентифікатором INOUT – одночасно вхідним і вихідним (глобальним)
параметром. Якщо параметрів немає, використовуються порожні круглі
дужки – ( );
– DETERMINISTIC – вказується, якщо ЗП повертає один і той самий
результат, і набуває одні й ті самі вхідні параметри. За замовчуванням – NOT
DETERMINISTIC;
– призначення інструкцій: CONTAINS SQL – у ЗП немає інструкцій читан-
ня-запису даних; NO SQL – у ЗП немає SQL-операторів; READS SQL DATA – ЗП
містить оператори читання (SELECT), але не містить операторів запису даних;
MODIFIES SQL DATA – ЗП містить оператори, які можуть модифікувати дані
(INSERT, DELETE).
– інструкція SQL SECURITY: у разі виклику ЗП – перевірка прав:
ідентифікатор INVOKER – користувач, ідентифікатор DEFINER – автор функції.
За замовчуванням використовується ідентифікатор DEFINER;
– ідентифікатор TYPE – тип параметра (тип даних MySQL);
– речення COMMENT – коментар (опис);
– інструкція DECLARE – оголошення змінних, var_name – ім’я змінної.
Якщо інструкція DEFAULT відсутня, початкове значення var_name дорівнює
NULL;
– синтаксис виклику збереженої процедури: CALL sp_name().
Збережена функція (Stored Function) є різновидністю збережених
процедур. Усі параметри збереженої функції (ЗФ) завжди вважаються вхідними
(мається на увазі IN). Синтаксис SQL-інструкції CREATE FUNCTION для
створення функції поданий у лістингу. 1.2.
Лістинг 1.2 – Синтаксис інструкції CREATE FUNCTION
CREATE [DEFINER = {user | CURRENT_USER}] FUNCTION sf_name
(param_name TYPE [,...]])
10
RETURNS TYPE [COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC
| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY {DEFINER | INVOKER}]
[BEGIN]
DECLARE var_name [,var_name] ... TYPE [DEFAULT значення];
# тіло функції
routine_body;
RETURN sf_name;
[END;]
Для застосовування інструкції CREATE FUNCTION використовуються такі
правила, позначення й інструкції мови SQL:
– ідентифікатор sf_name – ім’я збереженої функції (Stored Function);
– параметри збереженої функції завжди є вхідними (мається на увазі IN).
Якщо параметрів немає, використовуються порожні круглі дужки «( )»;
– ідентифікатор TYPE – тип параметра (тип даних MySQL);
– речення RETURNS TYPE – тип значення, що повертає функція (тип даних
MySQL);
– речення COMMENT – коментар (опис);
– інструкція DETERMINISTIC – вказується, якщо збережена функція
повертає один і той самий результат, і набуває одні і ті самі вхідні параметри.
За замовчуванням – NOT DETERMINISTIC;
– призначення інструкцій: CONTAINS – у збереженої функції (ЗФ) немає
інструкцій читання-запису даних; NO SQL – у ЗФ немає SQL-операторів;
READS SQL DATA – ЗФ містить оператори читання (SELECT), але не містить
операторів запису даних; MODIFIES SQL DATA – ЗФ містить оператори, які
можуть модифікувати дані (INSERT, DELETE);
– інструкція SQL SECURITY: у разі виклику ЗФ – перевірка прав:
ідентифікатор INVOKER – користувач, ідентифікатор DEFINER – автор функції.
За замовчуванням використовується ідентифікатор DEFINER;
– речення DECLARE – оголошення змінних, var_name – ім’я змінної.
Якщо речення DEFAULT відсутнє, початкове значення var_name дорівнює
NULL;
– інструкція RETURN – повернення результату функцією sf_name.
– синтаксис виклику збереженої функції: SELECT sf_name().
Змінні в SQL-запитах. В SQL-запитах можуть використовуватися змінні.
Визначені користувачем змінні дійсні тільки для поточної сесії й видаляються
під час закриття сеансу. Синтаксис оголошення змінної: @var_name. Ім’я
змінної обов’язкове починається з комерційного at («@») і складається з
11
буквено-цифрових символів (не більше 64-х), наприклад, @my_var, @'My_var',
@"my-var", @`My$var`. Імена змінних користувача не чутливі до регістру.
Змінні не можуть використовуватися безпосередньо в операторі SQL як
ідентифікатор (або частина ідентифікатора). Наприклад, у тих контекстах, де
очікуються ім’я таблиці або бази даних, або як зарезервоване слово СУБД
MySQL. Виняток – використання текстових змінних в інструкції CONCAT. Існує
неоднозначність і під час присвоєння числових значень змінним. У цьому
випадку рекомендується використовувати функцію CAST.
Для ініціалізації змінної може використовуватися інструкція SET. Для
ініціалізації змінної без інструкції SET має завжди використовуватися оператор
присвоювання у вигляді символу двокрапки й знака рівно («:=»):
SET @var_name {=|:=} expr [,@var_name {=|:=} expr] ...
@var_name:=expr – без інструкції SET.
Змінні, значення яких використовуються як фактичні параметри під час
виклику процедур з параметром INOUT, є глобальними.
Локальні змінні в збережених процедурах і функціях. У збережених
процедурах і функціях можуть використовуватися локальні змінні. Область
існування локальних змінних – блок операндів BEGIN...END, де вони
оголошені. Як локальні змінні використовуються фактичні значення параметрів
процедур (оголошені з IN) і функцій, що вказуються в SQL-інструкціях
виклику. Також локальні змінні можуть бути визначені й ініціалізовані за
допомогою інструкції DECLARE:
DECLARE var_name [, var_name ] ... TYPE [DEFAULT value ]
Для ініціалізації локальних змінних може використовуватися:
– інструкція SET, із синтаксисом:
SET var_name {=|:=} expr [, var_name {=|:=} expr] ...
– інструкція SELECT...INTO, із синтаксисом:
SELECT source_query INTO var_list
– інструкція FETCH...INTO, що відкриває курсор, і має синтаксис:
FETCH ... INTO var_list
Як вираз expr і джерело запиту source_query (табл. 1.2–1.3) може
використовуватися запит на вибірку, функція, інші змінні. Кількість значень,
що відбираються, має збігатися з кількістю змінних у списку var_list,
перерахованих через кому.
Складений оператор BEGIN...END. Складений оператор BEGIN...END
використовується в збережених програмних об’єктах для об’єднання
SQL-операторів в один блок. Кожен з SQL-операторів, що входить у список
12
statement_list (табл. 1.2–1.3), закінчується обов’язковим роздільником –
крапкою з комою («;»). Після завершальної інструкції END також ставиться
крапка з комою. Допускається використання statement_list без операторів.
Для дострокового виходу із блоку BEGIN...END використовується оператор
LEAVE. У цьому випадку необхідно використовувати необов’язкову мітку
label. Синтаксис складеного оператора:
«[label:] BEGIN [statement_list] END [label];».
Оператор LEAVE. Синтаксис оператора: «LEAVE label;». Оператор
використовується для виходу з конструкції управління потоком, яка
використовує мітку label. Оператор LEAVE може використовуватися в
конструкціях BEGIN...END і в циклах LOOP, REPEAT, WHILE.
Оператори управління потоком виконання
Оператор IF. Блок управління потоком виконання коду збережених
процедур реалізується за допомогою оператора IF...END IF, що здійснює
перевірку заданої умови переходу (search_condition). Синтаксис викорис-
тання інструкції IF...END IF поданий у лістингу 1.3.
Лістинг 1.3 – Синтаксис блоку управління потоком IF...END IF
IF search_condition THEN
[BEGIN] statement_list; [END;]
[ELSE]
[BEGIN] statement_list; [END;]
END IF;
#если використовується ELSEIF
IF search_condition1
THEN statement_list1
ELSEIF search_condition2
THEN statement_list2
[ELSEIF search_condition3
THEN statement_list3]
...
[ELSE statement_listN]
END IF;
Для застосовування блоку управління потоком IF...END IF використо-
вуються такі правила, позначення й інструкції мови SQL:
– список statement_list містить мінімум один або декількох
SQL-операторів.
– оператор END IF – має бути завершений крапкою з комою («;»).
– якщо search_condition=TRUE, то виконується оператор (оператори),
що входять в statement_list інструкції THEN. якщо search_condition=
=FALSE – виконується statement_list інструкції ELSE;
13
–якщо використовується один ELSEIF перевіряється умова search_
condition1. Якщо вона дорівнює TRUE, то виконується оператор THEN
statement_list1 і здійснюється вихід із блоку IF. Якщо search_
condition1=FALSE, то оператором ELSEIF перевіряється умова search_
condition2. Якщо умова дорівнює TRUE, виконується оператор THEN
statement_list2, а якщо FALSE – інструкція ELSE statement_listN.
– кількість операторів ELSEIF не обмежена.
Оператор CASE. Оператор CASE використовується для перевірки
множини умов і виконання, пов’язаного з ним SQL-коду.
Синтаксис двох варіантів використання операторів CASE подається у
лістингу 1.4.
Лістинг 1.4 – Синтаксис оператора CASE
# Синтаксис CASE (варіант 1)
CASE case_value
WHEN when_value1 THEN statement_list1
[WHEN when_value2 THEN statement_list2]
...
[ELSE statement_listN]
END CASE
# Синтаксис CASE (варіант 2)
CASE
WHEN search_condition1 THEN statement_list1
[WHEN search_condition2 THEN statement_list2]
...
[ELSE statement_listN]
END CASE
Для першого варіанта синтаксису (лістинг 1.4), значення заданого виразу
case_value порівнюється зі значенням when_value для кожного елемента
речення WHEN. Якщо знайдене рівне йому значення (case_value=
=when_value1), виконується відповідний список операторів THEN
statement_list1. (порожній statement_list заборонений). Якщо таких
значень when_value немає, то виконується інструкція ELSE statement_
listN (якщо вона використовується). Даний варіант синтаксису не може
використовуватися для перевірки виразу case_value на рівність NULL
(рівність NULL=NULL є помилковою).
Для другого синтаксису CASE (лістинг 1.4) один за одним перевіряються
умови search_condition кожного виразу WHERE. Якщо зустрічається резуль-
тат TRUE, то виконується відповідна йому інструкція THEN statement_list.
14
Якщо всі умови для WHERE повертають FALSE, виконується інструкція ELSE
statement_listN (якщо вона використовується).
Оператор циклу LOOP. Оператор LOOP реалізує цикл, що задає повторне
виконання списку операторів statement_list. Список statement_list
складається з одного або декількох операторів, розділених крапкою з
комою («;»). Цикл LOOP не має умов виходу. Тому даний вид циклу
обов’язково має у своєму складі оператор LEAVE (для збереженої функції може
використовуватися оператор RETURN). Синтаксис оператора LOOP наведено у
лістингу 1.5.
Лістинг 1.5 – Синтаксис оператора LOOP
[label_1:] LOOP
# тіло цікла
statement_list
[IF...THEN LEAVE label_1;]
END LOOP [label_1];
Оператори списку statement_list виконуються в циклі. Операнд END
LOOP label_1 передає управління мітці label_1, тобто операнду LOOP. Якщо
не використовувати оператор LEAVE, цикл виконуватиметься нескінченно.
Оператор циклу REPEAT. Список операторів statement_list у блоці
циклу REPEAT повторюється до тих пір, доки вираз search_condition
істинний (TRUE). Умова перевіряється щоразу, коли виконується оператор
UNTIL, тому цикл REPEAT завжди виконується хоча б один раз. Список
statement_list складається з одного або декількох операторів, розділених
крапкою з комою («;»). Для дострокового виходу із циклу використовується
оператор LEAVE. У цьому випадку необхідно використовувати необов’язкову
мітку label. Синтаксис оператора REPEAT наведено у лістингу 1.6.
Лістинг 1.6 – Синтаксис оператора REPEAT
[label:]REPEAT
# тіло цікла
statement_list
UNTIL search_condition END
REPEAT [label];
Оператор циклу WHILE. Список операторів statement_list у блоці
циклу WHILE повторюється до тих пір, доки вираз search_condition
істинний (TRUE). Умова перевіряється на початку кожного циклу. Список
statement_list складається з одного або декількох операторів, розділених
крапкою з комою («;»). Для дострокового виходу із циклу використовується
15
оператор LEAVE. У цьому випадку необхідно використовувати необов’язкову
мітку label. Синтаксис оператора WHILE наведено у лістингу 1.7.
Лістинг 1.7 – Синтаксис оператора WHILE
[label:] WHILE search_condition DO
# тіло цікла
statement_list
END WHILE [label];
Оператор GOTO. Оператор GOTO дозволяє здійснювати безумовний
перехід до оператора (operator), позначеного міткою «label : operator» і
має такий синтаксис: «GOTO label». Мітка label може не прив’язуватися до
оператора процедури. У цьому випадку вона оголошується окремо за
допомогою оператора LABEL, який має такий синтаксис: «LABEL label;».
Використання курсорів (Cursors). Для локальних змінних, що
використовуються у збережених процедурах, не підтримується така структура
даних, як масив. Тобто, якщо запит на вибірку повертає множину значень, у
розроблювача немає можливості для їхнього збереження в локальній змінній.
Для вирішення цієї проблеми використовуються курсори.
Реалізація курсорів у СУБД MySQL передбачає такі обмеження їх
використання:
– для реалізації запиту на вибірку, пов’язаного з курсором, завжди
створюється тимчасова таблиця. Внаслідок цього, курсори нечутливі до змін у
базі даних після виконання SELECT-запиту;
– курсори працюють у режимі тільки читання даних;
– курсори переглядають відібрані записи SELECT-запиту тільки в одному
напрямку (від початку до кінця вибірки) і не можуть їх пропускати;
– вибірку даних, пов’язану з курсором, можна впорядкувати (ORDER BY)
або обмежити (WHERE, LIMIT).
Синтаксис оголошення й використання курсору поданий у лістингу 1.8.
16
OPEN cursor_name
# оператор циклу
[LOOP | REPEAT | WHILE]
# звертання до курсору
FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
# закриття циклу
[END {LOOP | REPEAT | WHILE]}]
# закриття курсору
CLOSE cursor_name
END;
Для застосовування курсорів (CURSOR) використовуються такі правила,
позначення й інструкції мови SQL:
– оголошення курсору має відображатися після опису змінних (DECLARE)
і перед оголошеннями оброблювачів;
– допускається використовувати кілька курсорів. Для кожного курсору
робляться всі обов’язкові оголошення. Використовуваний курсор має бути
відкритий і закритий;
– курсор, що оголошується з інструкцією DECLARE і ім’ям cursor_name,
зв’язується з полями col_name SELECT-запиту;
– інструкція DECLARE ... HANDLER – це оголошення оброблювача для
ситуації, коли курсор досягає кінцевого запису таблиці запиту. У цьому випад-
ку var_name буде привласнене значення value. Значення value і ім’я
var_name визначає розробник коду;
– оператор OPEN виконує SELECT-запит, створює тимчасову таблицю й
зв’язує курсор з полями col_name;
– оператор FETCH використовується в циклі для послідовного відбору
значень полів col_name записів SELECT-запиту та присвоєння їх змінним
var_name. Імена var_name і col_name не можуть збігатися. Кількість полів
col_name і var_name мають збігатися;
– оператор CLOSE закриває курсор і пов’язану з ним тимчасову таблицю
SELECT-запиту.
17
2. Визначити ту частину запитів і бізнес-функцій високонавантаженої
системи, які необхідно реалізувати за допомогою збережених процедур і
функцій.
3. Скласти перелік збережених процедур (функцій) і пов’язаних з ними
бізнес-функцій системи. Установити порядок взаємного виклику процедур і
функцій.
4. Список збережених процедур і функцій і пов’язаних з ними бізнес-
функцій системи подати у звіті в табличному вигляді.
18
Таблиця 1.2 – Порівняльний аналіз можливостей процедур і функцій
№ Аналізовані параметри Процедура Функція
1. Синтаксис. Повернення результату.
2. Синтаксис. Формальні й фактичні параметри.
3. Синтаксис. Виклик.
4. Результат, що повертається (результуюча множина, одиночне
значення тощо)
5. Можливі операції (операції над даними, створення набору
даних тощо)
6. Підтримують наступні операції (зазначити: транзакції, SQL-
інструкції SELECT, UPDATE, CURSOR тощо)
7. Взаємний виклик (процедура-функція, функція-процедура)
8. Статус програмного об’єкта (глобальний – для всіх БД,
локальний – тільки для однієї БД тощо)
9. Порядок виконання сервером MySQL.
10. Фізичне зберігання (шлях, імена файлів та їх розширення)
19
програмного пакета Workbench – у вигляді EER-діаграм, для таблиць – нотація
Workbench [Default], для зв’язків – нотація IDEF1X);
– формулювання завдання 1.1;
– таблицю з переліком 6–9 функцій та 6-9 процедур для бізнес-функцій
високонавантаженої системи. Приклад оформлення поданий у табл. 1.5;
20
1.6 Контрольні запитання та завдання
21
20. Поясніть призначення повідомлень поля select type таблиці
EXPLAIN (simple, primary, derived, subquery, dependent subquery,
uncachable subquery, union, dependent union, union result).
21. Поясніть призначення повідомлень поля «type» таблиці EXPLAIN
(system, const, eq_ref, ref, fulltext, ref_or_null, index_merge,
unique_subquery, index_subquery, range, index, all).
22. Поясніть призначення повідомлень поля Extra таблиці EXPLAIN
(Distinct, Not exists, Range checked for each record, Using filesort,
Using index, Using temporary, Where used).
23. Розставте подані за абеткою типи зв’язування (all, const, eq_ref,
index, range, ref, system), що вказуються в полі type таблиці EXPLAIN,
упорядкувавши їх від кращого до гіршого з погляду забезпечення оптимізації.
22
використовувати розроблені раніше функції. Надати SQL-код для виклику
процедури.
1.6.2.6. Процедуру із заданим ім’ям, яка повертає різні значення
параметрів залежно від заданих умов (вхідного параметра). Створити три
варіанти запитів, у яких для зв’язування таблиць використовуються:
а) інструкція INNER JOIN; б) інструкція WHERE; в) тільки підзапити.
Використовувати такі оператори управління потоком виконання: а) оператор
IF...THEN...ELSEIF; б) оператор CASE (використовувати два варіанти
синтаксису). Надати SQL-код для виклику процедури.
1.6.2.7. Процедуру, призначену для створення тимчасової таблиці
(TEMPORARY TABLE), що містить вказану інформацію. Процедура має
забезпечувати перевірку на існування тимчасової таблиці. Залежно від
результату перевірки має здійснюватися: а) видалення таблиці або видалення
всіх її записів; б) створення тимчасової таблиці (SQL-запит CREATE
TEMPORARY TABLE); в) заповнення тимчасової таблиці даними з базових
таблиць (SQL-запит INSERT...SELECT). Надати SQL-код для виклику
процедури й вибірки даних з тимчасової таблиці.
1.6.2.8. Процедуру, яка для формування даних вихідних параметрів
використовує курсор (DECLARE…CURSOR FOR). Для контролю роботи курсору
створити в коді процедури SQL-запит на створення контрольної таблиці. Для
забезпечення програмної роботи курсору використовувати оператори циклу
а) WHILE; б) LOOP; в) REPEAT. Проміжні дані, отримані за допомогою курсору,
записати в контрольну таблицю. Надати код для виклику процедури й SQL-
запити на вибірку всіх даних з таблиці.
1.6.2.9. Процедуру, яка дозволяє розв’язати завдання вибірки й
модифікації даних базових таблиць з урахуванням заданих умов і специфіки
високонавантаженої бази даних.
23
ПЕРЕЛІК ДЖЕРЕЛ ПОСИЛАННЯ
24
ДОДАТОК A
Приклад оформлення титульного аркуша звіту з виконання
завдань практичного заняття
Кафедра системотехніки
ЗВІТ
з виконання завдань практичного заняття № _____
дисципліни «Проектування високонавантажених систем
зберігання даних»
на тему: ________________________________________________
(тема практичного заняття)
Виконав
студент групи ________________
(найменування групи)
____________________________
(прізвище, ім’я по батькові)
Перевірив
доцент кафедри СТ
Коваленко А.І.
Харків, 2020
25
ДОДАТОК Б
Зміст звіту про виконання завдань практичного заняття
5 Висновки
Наводяться висновки за результатами виконання завдань практичного
заняття.
26
ДОДАТОК В
Теми індивідуальних завдань
27
ДОДАТОК Г
Типи даних СУБД MySQL
СУБД MySQL підтримує такі типи даних для полів таблиць: числові (точні
й наближені числові типи); рядкові; календарні; NULL (значення, що вноситься
в поле таблиці та позначає відсутність інформації). Числові типи даних СУБД
MySQL подані в табл. Г.1. У таблиці Г.1 використовуються наступні позначення:
«[ ]» – необов’язкове оголошення атрибута типу; атрибут UNSIGNED задає
числове значення без знака; атрибут ZEROFILL задає відображення нулів у
незначущих розрядах. Якщо зазначений атрибут ZEROFILL, то MySQL
автоматично додає атрибут UNSIGNED; «M» – визначає загальну кількість
значущих розрядів числа (точність), включаючи точку; «D» – визначає кількість
значущих розрядів числа після точки (шкала). Слід пам’ятати, що під час
виконання операцій з числовими величинами, одна з яких належить до типу
UNSIGNED, результат буде завжди позитивним (без знака).
28
Таблиця Г.1 (продовження)
Оголошення типу Об’єм Діапазон
пам’яті
TINYINT(1) 1 byte 0 (false) або 1 (true)
DECIMAL[(M[,D])] (М + 2) byte Залежить від параметрів
DEC[(M[,D)]] 1 M 64 точності (М) і шкали (D)
NUMERUC[(M[,D)]] 0 D 30
з атрибутами
[UNSIGNED] [ZEROFILL]
Наближені числові типи
Число з плаваючою точкою і 4 byte Від 1,175494351E-38
одинарною точністю 1 M 24 До 3,402823466E+38
FLOAT[(M[,D])] [UNSIGNED] Точність – приблизно 7
[ZEROFILL] знаків після точки.
Число з плаваючою точкою і 8 byte шкала:
подвійною точністю 25 M 53 -2.225073858507201E-308,
REAL[(M[,D])] [UNSIGNED] 0,
[ZEROFILL] 1.79769313486231E+308
DOUBLE PRECISION[(M[,D])]
[UNSIGNED] [ZEROFILL]
Рядкові типи даних СУБД MySQL подані в табл. Г.2. У таблиці Г.2
використовуються такі позначення: «М» – кількість заданих символів у рядку;
«L» – фактична довжина рядка, що збережена в поле таблиці, а приплюсовані
до неї «L» байти – накладні витрати для зберігання довжини рядка (префікса);
атрибут BINARY (якщо заданий, то рядки сортуються не за символами, а як
послідовності байтів); атрибут NATIONAL задає визначений набір символів у
кодуванні UTF8.
29
Таблиця Г.2 (продовження)
Оголошення Об’єм пам’яті Опис
типу Розмір
TEXT L+2 byte Під час виконання операцій над полями
L 216-1= типу TEXT враховується кодування.
=65’535 Тільки цей тип використовується для
повнотекстового пошуку
TINYBLOB L+1 byte Зменшений BLOB
TINYTEXT L 28-1=255 Зменшений TEXT
MEDIUMBLOB L+3 byte Середній BLOB
MEDIUMTEXT L 224-1= Середній TEXT
=16’777’215
LONGBLOB L+4 byte Довгий BLOB
LONGTEXT L 232-1= Довгий TEXT
=4’294’967’296
ENUM('element1', 1 byte Перерахування. Список ENUM може
'element2', ...) або містити 256 елементів (1 байт) або від
2 byte 257 до 65536 елементів (2 байти).
Об’єкт рядка може мати тільки одне
значення, обране із заданого списку
елементів.
SET('element1', 1, 2, 3, 4 Набір. Список SET може містити:
'element2', ...) або 8 byte від 1 до 8 елементів (1 байт),
від 9 до 16 елементів (2 байта),
від 17 до 24 елементів (3 байта),
від 25 до 32 елементів (4 байта),
від 33 до 64 елементів (8 байт).
Таблиця може містити не більш 255
унікальних визначень ENUM і SET.
Календарні типи даних СУБД MySQL подані в табл. Г.3. У таблиці Г.3
використовуються такі позначення: формат YYYY-MM-DD для дат виду 2009-
10-15; формат YY-MM-DD для дат виду 09-10-15; формат HH:MM:SS, де HH –
години, MM – хвилини, SS – секунди, наприклад, 10:48:56. Дати завжди
вказуються в порядку «РІК-МІСЯЦЬ-ДЕНЬ».
30
ДОДАТОК Д
Опис полів таблиць навчальної бази даних
31
ДОДАТОК Е
Основні математичні функції СУБД MySQL
32
ДОДАТОК Ж
Основні рядкові функції СУБД MySQL
33
Таблиця Ж.1 (продовження)
Синтаксис Опис
LPAD (str, len, padstr) Повертає рядок str, доповнений ліворуч рядком padstr до
довжини len символів. Якщо рядок містить більше len
символів, то він усікається до len
LTRIM (str) Повертає рядок str, у якому видалені всі початкові пробіли
MID (str, pos [, len]) Повертає підрядок рядка str, що починається з позиції pos і
має довжину len символів. Якщо параметр len не вказується,
то підрядок повертається, починаючи з позиції pos і до кінця
рядка str
OCT (N) Приймає десяткове число N і повертає його у вісімкової
системі числення
ORD (str) Повертає значення ASCII-коду першого символу рядка str.
На відміну від функції ASCII() коректно працює з
багатобайтним кодуванням
REPEAT (str, count) Повертає рядок, отриманий з count повторень рядка str
REPLACE (str, from_str, Повертає рядок str, у якому всі підрядки from_str замінені
to_str) на to_str
REVERSE (str) Повертає рядок str, записаний у зворотному порядку
RIGHT (str, len) Повертає len крайніх правих символів рядка str, або весь
рядок, якщо аргумент len дорівнює NULL або менше 1
RPAD (str, len, padstr) Повертає рядок str, доповнений праворуч рядком padstr до
довжини len символів
RTRIM (str) Повертає рядок str, у якому видалені всі кінцеві пробіли
SPACE (N) Повертає рядок, що містить N пробілів, або порожній рядок,
якщо N має від’ємне значення
SUBSTRING_INDEX (str, Повертає підрядок рядка str. Якщо параметр N0, то функція
delim, N) знаходить N-е (початок нумерації – ліворуч) входження
підрядка delim в рядок str і повертає всю частину рядка, що
міститься зліва від підрядка delim. Якщо N<0, то функція
знаходить N-е входження (початок нумерації – праворуч)
підрядка delim в рядок str і повертає частину рядка, що
міститься праворуч від підрядка delim
TRIM ([[BOTH | LEADING Видаляє з рядка str розташовані на початку (наприкінці)
| TRAILING ] [remstr] символи, наведені в рядку remstr. Якщо є ключове слово
FROM ] str) LEADING, видаляються символи на початку рядка str, якщо
TRAILING – наприкінці, якщо BOTH – і на початку й
наприкінці. Якщо ключові слова не задані, за замовчуванням
приймається BOTH. Якщо рядок remstr не заданий, то
символами, що видаляються, є пробіли.
UNHEX (str) Є зворотньою до функції HEX( ) і інтерпретує кожну пару
символів рядка str як шістнадцятковий код, який необхідно
перетворити в символ
UPPER (str) Перетворює всі символи рядка str у верхній регістр
34
ДОДАТОК К
Основні функції дати й часу СУБД MySQL
35
Таблиця К.1 (продовження)
Синтаксис Опис
PERIOD_DIFF (period1, Обчислює різницю в місяцях між двома датами,
period2) представленими в числовому форматі YYYYMMDD або YYMM
QUARTER (datetime) Повертає значення кварталу року ( від 1 до 4)
SECOND (datetime) Отримує зі значення datetime секунди (від 0 до 59)
SUBDATE (date, INTERVAL Повертає дату date, з якої віднімається часовий інтервал,
expr type) обумовлений другим параметром. Наприклад,
SUBDATE('2009-05-15', INTERVAL 5 DAY)
SUBTIME (datetime, time) Віднімає з величини datetime час time
TIME (datetime) Отримує зі значення datetime час доби
TIMEDIFF (expr1, expr2) Повертає різницю між часовими значеннями expr1 і expr2
TIMESTAMP (date, time) Приймає як аргумент дату date і час time. Повертає повний
варіант у форматі 'YYYY-MM-DD hh:mm:ss'
TIMESTAMPADD (interval, Додає до дати й часу доби datetime_expr часовий інтервал
int_expr, datetime_expr) int_expr, одиниці виміру якого задаються параметром
interval. Наприклад:
TIMESTAMPADD(WEEK, 1, '2009-09-02')
TIMESTAMPDIFF (interval, Повертає різницю між двома датами datetime_expr1 і
datetime_expr1, datetime_expr1. Одиниці виміру інтервалу задаються
datetime_expr2) параметром interval. Наприклад:
TIMESTAMPDIFF(MONTH, ‘2005-02-01’, ‘2005-05-01’)
TO_DAYS (date) Отримує дату date і повертає число днів N, що пройшли з
нульового року
WEEK (date) Повертає номер тижня в році (від 0 до 53) для дати date.
Передбачається, що тиждень починається з неділі
WEEKDAY (date) Для вказаної дати date повертає номер дня тижня (0 – для
понеділка, 1 – для вівторка, …, 6 – для неділі)
YEAR (datetime) Повертає рік зі значення datetime
YEARWEEK (date) Для вказаної дати date повертає число у форматі YYYYWW,
що представляє рік і номер тижня (від 0 до 53)
36
ДОДАТОК Л
Основні інформаційні функції СУБД MySQL
37
ДОДАТОК М
Логічні оператори СУБД MySQL
38
Навчальне видання
МЕТОДИЧНІ ВКАЗІВКИ
до практичних занять з дисципліни
«ПРОЕКТУВАННЯ ВИСОКОНАВАНТАЖЕНИХ
СИСТЕМ ЗБЕРІГАННЯ ДАНИХ»
для студентів усіх форм навчання спеціальності
122 – «Комп’ютерні науки»
за освітньо-професійною програмою
«Комп’ютерні науки та технології»