Вы находитесь на странице: 1из 39

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ

МЕТОДИЧНІ ВКАЗІВКИ
до практичних занять з дисципліни
«ПРОЕКТУВАННЯ ВИСОКОНАВАНТАЖЕНИХ
СИСТЕМ ЗБЕРІГАННЯ ДАНИХ»
для студентів усіх форм навчання
спеціальності 122 – «Комп’ютерні науки»
за освітньо-професійною програмою
«Комп’ютерні науки та технології»

ЗАТВЕРДЖЕНО
кафедрою системотехніки.
Протокол № 5 від 30.10.2019

Харків 2020

1
1 СТВОРЕННЯ ПРОЦЕДУР І ФУНКЦІЙ ДЛЯ
ВИСОКОНАВАНТАЖЕНИХ БАЗ ДАНИХ НА
ПЛАТФОРМІ СУБД MySQL

1.1 Мета заняття


– набуття практичних навичок зі створення збережених процедур
(Stored Procedures) і функцій (Stored Functions) серверної частини
високонавантаженої інформаційної системи;
– набуття практичних навичок з розробки SQL-запитів на вибірку й
модифікацію даних, що використовуються в збережених процедурах і
функціях, для забезпечення основних бізнес-процесів високонавантаженої
інформаційної системи;
– набуття практичних навичок з розробки та використання курсорів
(Cursors) у збережених процедурах;
– формування необхідних практичних умінь для аналізу плану виконання
SQL-запитів за допомогою оператора EXPLAIN;
– формування необхідних практичних умінь для створення збережених
процедур і функцій, з урахуванням особливостей роботи високонавантаженої
інформаційної системи зберігання даних.

1.2 Організація самостійної роботи студентів

Під час підготовки до виконання практичного заняття необхідно


вивчити:
– призначення, правила створення, зберігання й використання
збережених процедур (Stored Procedures) і функцій (Stored Functions);
– синтаксис використання SQL-інструкції CREATE PROCEDURE для
створення збережених процедур (Stored Procedures);
– синтаксис використання SQL-інструкції CREATE FUNCTION для
створення збережених функцій (Stored Functions);
– особливості використання операторів INSERT, UPDATE, DELETE для
маніпулювання даними базових таблиць у SQL-коді збережених процедур і
функцій;
– особливості використання функцій CONCAT() та GROUP_CONCAT() для
маніпулювання форматом вибірки інформації за допомогою інструкції SELECT;

2
– синтаксис використання локальних змінних, операторів управління
потоком виконання SQL-коду збережених процедур і функцій (оператори IF,
CASE, LOOP, REPEAT, WHILE, GOTO);
– особливості створення й використання курсорів (Cursors) у
збережених процедурах;
– методику аналізу плану виконання SQL-запитів, що використовуються у
збережених процедурах і функціях, за допомогою оператора EXPLAIN. Вивчити
призначення полів і повідомлень таблиці EXPLAIN;
– індивідуальне завдання (пп. 1.3);
– вивчити теоретичний матеріал базового підручника [2] та відповідні
теми додаткової літератури [3–5].
Виконати:
– завдання самостійних робот №№ 18–19 [1];
– розробку SQL-запитів згідно із завданнями практичного заняття,
підготувати відповідні розділи звіту.

1.3 Завдання на самостійну роботу

Завдання 1.1. Для бази даних з таблицями InnoDB, створеної відповідно


до завдання 1.3 практичного заняття № 1, розробити перелік збережених
процедур (функцій), необхідних для забезпечення бізнес-функцій, на які
впливає специфіка високонавантажених систем. Під час створення переліку
врахувати результати виконання п.2.3.9 завдання 2.2.
Завдання 1.2. Відповідно до переліку завдання 1.1 розробити збережені
процедури й функції для бази даних з таблицями типу InnoDB і SQL-запити до
них. Провести аналіз плану виконання SQL-запитів, що використовуються в
збережених процедурах і функціях, за допомогою оператора EXPLAIN. Оцінити
план виконання кожного SQL-запиту з висновком «неможливо оптимізувати»
або «вимагає оптимізації». Підготувати стислі пропозиції з коректування коду
SQL-запитів, схеми зв’язків, типів даних для зменшення часу запиту.
Завдання на створення збережених процедур (функцій) конкретизуються
для схеми навчальної бази даних, поданої на рис. 2.1 (опис полів навчальної
бази даних подається в додатку D). Виконавці завдань створюють збережені
процедури (функції) для бази даних, розробленої відповідно до завдання 1.3
практичного заняття № 1, і її схемою даних. Збережені процедури (функції)
мають відповідати предметній області індивідуального завдання практичного

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-код для виклику функції. Приклад виведення:

1.2.1.3 Функцію з ім’ям «id_for_order()», яка повертає id-клієнта


(client.id_client) за заданим ідентифікатором замовлення (order.
id_order). Надати SQL-код для виклику функції.
1.2.1.4 Функцію з ім’ям «count_order_for_date()», яка повертає
кількість замовлень із зазначеним найменуванням товару (product.name) для
поточної (системної) дати (order.data). Реалізувати можливість повернення
функцією загальної кількості замовлень за всіма категоріями товарів, якщо
найменування товару задано, як значення NULL. Надати SQL-код для виклику
функції. Приклад виведення:

1.2.1.5 Функцію з ім’ям «sum_order_for_date()», яка повертає для


поточної (системної) дати (order.data):
а) кількість замовлень зі статусом «підтверджений» і загальну суму у
форматі: «Підтверджене: [кількість замовлень] – [сума у форматі
ХХХ,ХХ] грн.»;

4
б) кількість замовлень зі статусом «виконаний» і загальну суму у форматі:
«Виконано: [кількість замовлень] – [сума у форматі ХХХ,ХХ] грн.». Надати
SQL-код для виклику функції. Приклад виведення:

1.2.1.6 Функцію з ім’ям «client_orders_id()», яка повертає за


заданим ідентифікатором клієнта (client.id_client) перелік його id-
замовлень (order.id_order) через кому. Формат: «Клієнт [id_client]:
замовлення[id_order, id_order, ...]». Під час складання SQL-запиту
використовувати функцію GROUP_CONCAT(). Надати SQL-код для виклику
функції. Приклад виведення:

1.2.2 Створити збережені процедури:


1.2.2.1 Процедуру «id_orders_info()», яка для заданого номера
замовлення (id_orders) повертає:
– параметр id_cl, що містить інформацію про id-клієнта;
– параметр info_cl, що містить інформацію у форматі: «id–Прізвище
Ім’я По батькові» (id_client–Surname Name Middlename);
– параметр info_order, що містить інформацію у форматі: «Замовлення
[id_order] - Дата [order.data] - [id=product.id_product--product.name
units shop_quantity]».
В SQL-коді процедури обов’язково використовувати функції
surname_for_order(), id_for_order(), розроблені в пп. 1.2.1.2 і 1.2.1.3,
відповідно. Надати SQL-код для виклику процедури. Приклад виведення:

1.2.2.2 Процедуру «count_status_order()», яка дозволяє отримати на


поточну дату дані для визначеного (ostatus) статусу замовлень. Значення
вхідного формального параметра ostatus:
– ostatus=1 – «не підтверджений», визначається для двох залежних
умов: «order.st_initiate=false» і «order.st_executed=false»;
– ostatus=2 – «підтверджений», визначається для двох залежних умов:
«order.st_initiate=true» і «order.st_executed=false»;
– ostatus=3 – «виконаний», визначається для двох залежних умов:
якщо «order.st_initiate= true» і «order.st_executed= true».
Параметри, що повертає процедура:
– ord_count – загальна кількість замовлень;

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-код для виклику процедури. Приклад виведення:

1.2.2.3 Процедуру «create_tmp_order()», призначену для створення


тимчасової таблиці (TEMPORARY TABLE tmp_order), що містить повну
інформацію про замовлення й клієнтів для адміністратора системи. Поля
таблиці tmp_order подані в табл. 1.1. Процедура має забезпечувати перевірку
на існування тимчасової таблиці. Залежно від результату перевірки повинне
здійснюється:
– видалення таблиці tmp_order або видалення всіх її записів (SQL-запит
DROP/TRUNCATE TEMPORARY TABLE),

Таблиця 1.1 – Поля таблиці tmp_order


№ Поля таблиці Формат зберігання даних Поля базових таблиць
tmp_order
1. id_tmp Первинний ключ таблиці tmp_order –
2. PIB Прізвище, Ім’я, По батькові мобільний Поля таблиці client: surname,
телефон name, middlename, mob_phone
3. id_order Номер замовлення Поле order-id_order
4. date Дата замовлення у форматі Поле order-data
«DD-MM-YYYY»
5. st_initiate Статус замовлення «підтверджений» Поле order-st_initiate
6. st_executed Статус замовлення «виконаний» Поле order-st_executed
7. name Найменування товару Поле product-name
8. shop_quantity Кількість замовленого товару shopping_cart-shop_quantity
9. quantity Кількість товару на складі Поле product-quantity
10. summa_order Сума за кожним найменуванням Добуток полів таблиць: product–
товару (пункту замовлення) priceshopping_cart =
shop_quantity

– створення таблиці tmp_order (SQL-запит CREATE TEMPORARY TABLE);

6
– заповнення tmp_order необхідними даними з базових таблиць
(SQL-запит INSERT ... SELECT).
Надати SQL-код для виклику процедури. Скласти SQL-запити до
тимчасової таблиці tmp_order, що дозволяють отримати:
а) усі записи про замовлення;
б) інформацію про непідтверджені замовлення;
в) інформацію про підтверджені замовлення;
г) інформацію про виконані замовлення.
Приклад вибірки даних таблиці tmp_order представлений на рис. 1.1.

Рисунок 1.1 – Приклад вибірки даних таблиці tmp_order


1.2.2.4 Використовуючи кожний з розроблених SQL-запитів пп.1.2.2.2
створити процедуру «cursor_order_sum()», яка дозволяє отримати на
поточну дату дані для всіх замовлень зі статусом «підтверджений». Статус
«підтверджений» визначається для двох залежних умов:
«order.st_initiate=true» та «order.st_executed=false».
Параметри, що повертає процедура:
– ord_count – загальна кількість замовлень;
– unit_sum – сумарна кількість товарів без урахування їхніх
найменувань;
– price_sum – загальна сума за всіма замовленнями одного статусу.
Параметри, що повертає процедура, unit_sum та price_sum отримати з
використанням курсору (DECLARE...CURSOR FOR). Проміжні дані курсору
записати в таблицю. Для цього:
– створити таблицю tmp_cursor з полями id_sum, quantity, price,
quantity_price (що містить добуток quantity*price), unit_sum,
price_sum;
– створити курсор, зв’язавши його із запитом, що повертає значення
shopping_cart.shop_quantity, product.price;
– за допомогою запиту визначити кількість замовлень ord_count зі
статусом «підтверджений» (кількість – shopping_cart.fk_order);
– з використанням курсору й операторів циклу (WHILE; LOOP; REPEAT)
розрахувати суми кількості товарів (unit_sum) без урахування їхніх
найменувань (shop_quantity) і загальну суму (price_sum) за всіма

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.

Приклад вибірки
з таблиці:

Приклад виведення
даних процедури:

1.2.2.5 Процедуру «add_order()», що забезпечує додавання нового


замовлення у таблицю order і один пункт замовлення з його кошика у таблицю
shopping_cart, з урахуванням специфіки роботи з високонавантаженої БД.
Вхідні параметри процедури:
– параметр idclient – id-клієнта (таблиця client, поле id_client);
– параметр idproduct – id-найменування товару (таблиця product,
поле id_product);
– параметр shquantity – кількість товару (таблиця shopping_cart,
поле shop_quantity).
Вихідний параметр, що повертається процедурою – номер замовлення
idorder (таблиця order, поле id_order). Під час розробки SQL-запиту
врахувати, що функція LAST_INSERT_ID() повертає невірний результат для
високонавантаженої бази даних.
Процедура має забезпечувати:
а) перевірку кількості замовленого товару на складі. Якщо кількість
замовленого товару (shop_quantity) перевищує кількість товару на складі
(product.quantity), замінити перше другим;
б) зміна кількості товару на складі (product.quantity), зменшуючи
його на кількість замовленого товару (shop_quantity).
Перевірити коректність роботи розробленого SQL-коду, використовуючи
процедуру create_tmp_order() (див. пп.1.2.2.3). Надати SQL-код для
виклику процедури add_order().

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).

1.4 Методичні вказівки до виконання аудиторних і домашніх задач

1.4.1 Теоретична частина


Збережені процедури й функції. Процедура (Stored Procedure) – це
іменований програмний об’єкт СУБД, написаний мовою SQL, що становить
собою загальний виконуваний ресурс для всіх баз даних. Код збереженої
процедури (ЗП) зберігається, компілюється й виконується на стороні сервера.
Якщо програмний додаток використовує процедуру (функцію), то
спочатку вона компілюється, поміщається в пам’ять і відпрацьовується як
запит. Запит кешується. Під час повторного звернення в одному з’єднанні
(сесії) використовується її кешована версія. Процедури можуть викликатися з
процедур, функцій і інших типів програмних об’єктів. Мета застосування
процедур і функцій – підвищення ефективності роботи з даними, шляхом
багаторазового використання повторюваного коду. Синтаксис SQL-інструкції
CREATE PROCEDURE для створення збереженої процедури поданий у
лістингу 1.1.
Лістинг 1.1 – Синтаксис інструкції CREATE PROCEDURE
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_name` $$
CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE `sp_name`
([IN | OUT | INOUT] param_name 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 значення];

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.

Лістинг 1.8 –Синтаксис оголошення й використання курсору (CURSOR)


CREATE PROCEDURE sp_name([IN | OUT | INOUT] param_name TYPE [,...]])
BEGIN
# оголошення змінних процедури
[DECLARE var_name [,var_name] ... TYPE]
# оголошення курсору
DECLARE cursor_name CURSOR FOR SELECT col_name1
[,col_name2] ... FOR ... [WHERE...LIMIT n ORDER BY...]
# оголошення оброблювача помилок
DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_name=value
# відкриття курсору

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-запиту.

1.4.2.2 Порядок виконання завдання 1.1

Послідовність етапів роботи для виконання завдання 1.1:


1. Провести аналіз бізнес-функцій високонавантаженої системи, що
використовує базу даних з таблицями InnoDB.

17
2. Визначити ту частину запитів і бізнес-функцій високонавантаженої
системи, які необхідно реалізувати за допомогою збережених процедур і
функцій.
3. Скласти перелік збережених процедур (функцій) і пов’язаних з ними
бізнес-функцій системи. Установити порядок взаємного виклику процедур і
функцій.
4. Список збережених процедур і функцій і пов’язаних з ними бізнес-
функцій системи подати у звіті в табличному вигляді.

1.4.2.3 Порядок виконання завдання 1.2


Послідовність етапів роботи для виконання завдання 1.2:
1. Згідно зі списком, розробленим у завданні 1.1, визначити перелік задач
для кожної збереженої процедури й функції.
2. Для кожної процедури (функції) визначити базові таблиці, що
використовуються в SQL-запитах.
3. Розробити весь необхідний перелік SQL-запитів, що дозволяє виконати
поставлені задачі.
4. Провести аналіз плану виконання розроблених SQL-запитів, за
допомогою оператора EXPLAIN.
5. Розробити SQL-код процедури (функції).
6. Провести тестування процедури (функції), фіксуючи зміни в базових
таблицях і запитах на вибірку.
7. Отримані дані й SQL-код подати у звіті.

1.5 Зміст звіту

Звіт має містити:


– тему та мету роботи;
– тему індивідуального завдання, постановку задачі;
– таблицю зі стислим порівняльним аналізом можливостей використання
процедур і функцій. Приклад оформлення поданий у таблиці 1.2;
– таблицю зі стислим порівняльним аналізом можливостей використання
процедур і тригерів. Приклад оформлення поданий у таблиці 1.3;
– таблицю зі стислим аналізом переваг використання процедур (функцій)
порівняно з SQL-запитами. Приклад оформлення поданий у таблиці 1.4;

18
Таблиця 1.2 – Порівняльний аналіз можливостей процедур і функцій
№ Аналізовані параметри Процедура Функція
1. Синтаксис. Повернення результату.
2. Синтаксис. Формальні й фактичні параметри.
3. Синтаксис. Виклик.
4. Результат, що повертається (результуюча множина, одиночне
значення тощо)
5. Можливі операції (операції над даними, створення набору
даних тощо)
6. Підтримують наступні операції (зазначити: транзакції, SQL-
інструкції SELECT, UPDATE, CURSOR тощо)
7. Взаємний виклик (процедура-функція, функція-процедура)
8. Статус програмного об’єкта (глобальний – для всіх БД,
локальний – тільки для однієї БД тощо)
9. Порядок виконання сервером MySQL.
10. Фізичне зберігання (шлях, імена файлів та їх розширення)

Таблиця 1.3 – Порівняльний аналіз можливостей процедур і тригерів


№ Аналізовані параметри Процедура Тригер
1. Синтаксис. Повернення результату.
2. Синтаксис. Формальні й фактичні параметри.
3. Синтаксис. Виклик.
4. Результат, що повертається (результуюча множина, одиночне
значення тощо)
5. Можливі операції (операції над даними, створення набору даних
тощо)
6. Підтримують наступні операції (зазначити: транзакції,
SQL-інструкції SELECT, UPDATE, CURSOR тощо)
7. Взаємний виклик ( процедура-тригер, тригер-процедура)
8. Статус програмного об’єкта (глобальний – для всіх БД,
локальний – тільки для однієї БД тощо)
9. Порядок виконання сервером MySQL.
10. Фізичне зберігання (шлях, імена файлів та їх розширення)

Таблиця 1.4 – Переваги використання процедур (функцій)


№ Аналізовані параметри Процедура SQL-запит
1 Принцип виконання SQL-коду в СУБД MySQL
2 Вплив на апаратні ресурси сервера
3 Вплив на мережний трафік
4 Можливість, що-небудь автоматизувати
5 SQL-синтаксис (обмеження)
6 Принцип зберігання SQL-коду

– скріншот схеми фізичної моделі бази даних з таблицями типу InnoDB у


нотації IDEF1X з обов’язковим відображенням первинних і зовнішніх ключів,
типу даних, атрибутів «NULL», «NOT NULL», кардинальності зв’язків (для

19
програмного пакета Workbench – у вигляді EER-діаграм, для таблиць – нотація
Workbench [Default], для зв’язків – нотація IDEF1X);
– формулювання завдання 1.1;
– таблицю з переліком 6–9 функцій та 6-9 процедур для бізнес-функцій
високонавантаженої системи. Приклад оформлення поданий у табл. 1.5;

Таблиця 1.5 – Процедури й функції високонавантаженої системи


№ Ім’я Призначення Взаємозв’язок Використовувані
процедури таблиці
(функції)
1 Функція Повертає id-клієнта за Використовується в client, order
id_for_order заданим id-замовлення процедурах
add_order,add_order_id
2 Процедура Забезпечує додавання Використовує функцію order,
add_order нового замовлення й id_for_order shopping_cart
один пункт замовлення
з його кошика
3 Процедура Забезпечує додавання За допомогою shopping_cart
add_order_id пунктів кошика add_order() одержує
замовлення id_order
тощо

– формулювання завдання 1.2;


– розроблений SQL–код 6–9 функцій, що відповідають прикладам
завдання 1.2. Для кожної функції надати скріншот результату її виконання.
Якщо функція модифікує дані, то мають бути подані скріншоти змінених даних
таблиць до й після після виконання функції;
– розроблений SQL–код 6–9 процедур, що відповідають прикладам
завдання 1.2. Для кожної процедури надати скріншот результату її виконання.
Якщо функція модифікує дані, то мають бути подані скріншоти змінених даних
таблиць до й після виконання процедури;
– для всіх SQL-запитів, розроблених для процедур і функцій, надати
скріншоти таблиць, отриманих за допомогою оператора EXPLAIN. У звіті має
бути подана стисла оцінка планів виконання розроблених SQL-запитів з
висновком «неможливо оптимізувати» або «вимагає оптимізації». Викладені
пропозиції з коректування коду SQL-запитів, схеми зв’язків, типів даних для
його зменшення часу запиту.
– висновки за роботою.

20
1.6 Контрольні запитання та завдання

1.6.1 Контрольні запитання


1. Що розуміють під термінами «Збережена процедура» (Stored
Procedure), «Збережена функція» (Stored Function)?
2. Як здійснюється робота СУБД MySQL зі збереженими процедурами й
функціями на фізичному рівні?
3. Як СУБД MySQL зберігає й виконує процедури й функції?
4. У чому відмінність збереженої процедури від функції (призначення;
синтаксис використання; виконувані операції)?
5. У чому відмінність збереженої процедури (функції) від тригера?
6. Наведіть синтаксис SQL-інструкції, відповідно до якої створюється
збережена процедура.
7. Наведіть синтаксис SQL-інструкції, відповідно до якої створюється
збережена функція.
8. Чи може з коду збереженої процедури викликатися інша процедура
(функція)?
9. Чи може з коду збереженої функції викликатися інша функція
(процедура)?
10. Які SQL-операції маніпулювання даними (SELECT, INSERT, UPDATE,
DELETE) допускається використовувати в збереженій процедурі (функції)?
11. Наведіть синтаксис SQL-інструкції з використанням функцій
CONCAT(), GROUP_CONCAT().
12. Наведіть синтаксис SQL-інструкції з використанням операторів IF
і CASE.
13. Наведіть синтаксис SQL-інструкції з використанням операторів циклу
LOOP, REPEAT, WHILE.
14. Наведіть синтаксис SQL-інструкції з використанням оператора GOTO.
15. У яких випадках в процедурах використовуються курсори (CURSOR)?
16. Наведіть синтаксис SQL-інструкцій для створення й використання
курсору.
17. З якою метою використовується оператор EXPLAIN?
18. Поясніть призначення полів, що використовуються у таблиці
EXPLAIN.
19. Які види повідомлень за кожним полем таблиці плану виконання
запиту надає оператор EXPLAIN?

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,
упорядкувавши їх від кращого до гіршого з погляду забезпечення оптимізації.

1.6.2 Контрольні завдання


На основі зазначеної схеми даних БД розробіть:
1.6.2.1. Функцію із заданим ім’ям, яка повертає значення полів базових
таблиць відповідно до заданих умов (параметрами функції). Розробити два
варіанти SQL-коду функції, з використанням для присвоєння локальним
змінним: а) інструкції SELECT ... INTO; б) інструкції SET. Надати SQL-код
для виклику функції.
1.6.2.2. Функцію із заданим ім’ям, яка повертає кілька значень полів
базових таблиць у заданому форматі й умовами вибірки. Розробіть для функції
три SQL-запити з використанням: а) тільки інструкції WHERE; б) тільки
інструкції INER JOIN; в) вкладеного запиту. Надати SQL-код для виклику
функції.
1.6.2.3. Функцію із заданим ім’ям, яка залежно від значення вхідного
параметра й заданих умов повертає різні набори даних для поточної (системної)
дати. Розробіть для функції SQL-запит, що використовує агрегатні функції
СУБД MySQL і інструкцію GROUP BY.
1.6.2.4. Функцію із заданим ім’ям, яка для заданих умов (параметрів
функції) повертає згруповані набори даних у зазначеному форматі для поточної
(системної) дати. Під час складання SQL-запиту використовувати функцію
GROUP_CONCAT(). Надати SQL-код для виклику функції.
1.6.2.5. Процедуру із заданим ім’ям, яка повертає параметри, що містять
кілька полів таблиць БД у заданому форматі. В SQL-коді процедури обов’язково

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
ПЕРЕЛІК ДЖЕРЕЛ ПОСИЛАННЯ

1. Методичні вказівки до самостійної роботи з дисципліни «Проектування


високонавантажених систем зберігання даних» для студентів усіх форм
навчання спеціальності 122 – «Комп’ютерні науки» за освітньо-професійною
програмою «Комп’ютерні науки та технології» / Упоряд. : Л.В. Колесник
та ін. – Харків: ХНУРЕ, 2020. – 161 с.
2. Шварц Б., Зайцев П., Ткаченко В. MySQL по максимуму :
Оптимизация, Репликация, Резервное копирование : Серия «Бестселлеры
O’Reilly» : 3-е издание / пер. с англ. – Санкт Петербург: Питер, 2018. - 864 с
3. Шварц Б., Зайцев П., Ткаченко В. и др. MySQL. Оптимизация
производительности : 2-е издание / пер. с англ. – Санкт Петербург: Символ-
Плюс, 2010. – 832 с.
4. Кузнецов М.В., Симдянов И.В. MySQL 5 : В подлиннике / Санкт
Петербург: БХВ-Петербург, 2010. – 1024 с.
5. Куликов С.C. Работа с MySQL, MS SQL Server и Oracle в примерах :
практ. пособие. – Минск: БОФФ, 2016. – 556 с.

24
ДОДАТОК A
Приклад оформлення титульного аркуша звіту з виконання
завдань практичного заняття

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ


Харківський національний університет радіоелектроніки

Кафедра системотехніки

ЗВІТ
з виконання завдань практичного заняття № _____
дисципліни «Проектування високонавантажених систем
зберігання даних»
на тему: ________________________________________________
(тема практичного заняття)

Виконав
студент групи ________________
(найменування групи)

____________________________
(прізвище, ім’я по батькові)

Перевірив
доцент кафедри СТ
Коваленко А.І.

Харків, 2020

25
ДОДАТОК Б
Зміст звіту про виконання завдань практичного заняття

1 Мета практичного заняття


Вказується мета практичного заняття.

2 Постановки задачі згідно з індивідуальним завданням


Формулюються задачі відповідно до індивідуального завдання.

3 Самостійна робота щодо підготовки до практичного заняття


Вказуються:
– стислий опис відповідей на теоретичні запитання;
– результати аналізу предметної області, відповідно до індивідуальної
теми;
– розроблений перелік SQL-запитів і пов’язаних з ними бізнес-функцій
високонавантаженої інформаційної системи;
– опис розроблених схем даних серверної частини високонавантаженої
інформаційної системи для двох типів таблиць (MyISAM та InnoDB), що
підтримуються платформою СУБД MySQL;
– опис розроблених програмних компонентів (збережених процедур,
функцій, тригерів, транзакцій тощо) серверної частини високонавантаженої
інформаційної системи;
– текст коду розроблених SQL-запитів та контрольні приклади для
перевірки їхньої працездатності.

4 Тестування і відлагодження розроблених SQL-запитів та програмних


компонентів серверу MySQL
Вказуються:
– результати (скріншоти) виконання розроблених SQL-запитів,
отриманих в середовищі розробки Workbench;
– скріншоти результатів виконання розроблених SQL-запитів програмних
компонентів (збережених процедур, функцій, тригерів, транзакцій тощо)
серверної частини високонавантаженої інформаційної системи.

5 Висновки
Наводяться висновки за результатами виконання завдань практичного
заняття.

26
ДОДАТОК В
Теми індивідуальних завдань

Теми індивідуальних завдань до практичних занять подані в таблиці В.1.

Таблиця В.1 – Теми індивідуальних завдань до практичних занять


№ Теми індивідуальних завдань
1. Високонавантажена інформаційна система «Магазин автомобільних запчастин».
2. Високонавантажена інформаційна система «Бібліотека».
3. Високонавантажена інформаційна система «Магазин побутової техніки».
4. Високонавантажена інформаційна система «Магазин одягу».
5. Високонавантажена інформаційна система «Прокат спортивного інвентарю».
6. Високонавантажена інформаційна система «Служба таксі».
7. Високонавантажена інформаційна система «Склад».
8. Високонавантажена інформаційна система «Центр сервісного обслуговування».
9. Високонавантажена інформаційна система «Поліклініка».
10. Високонавантажена інформаційна система «Прокат відеофільмів».
11. Високонавантажена інформаційна система «Ресторан».
12. Високонавантажена інформаційна система «Планувальник робочий дня».
13. Високонавантажена інформаційна система «Кінотеатр».
14. Високонавантажена інформаційна система «Автопарк. Вантажні перевезення».
15. Високонавантажена інформаційна система « Фітнес-Клуб».
16. Високонавантажена інформаційна система «Хімчистка».
17. Високонавантажена інформаційна система розподілу задач між виконавцями з
наступним контролем їх виконання.
18. Високонавантажена інформаційна система «Гуртожиток».
19. Високонавантажена інформаційна система «Готель».
20. Високонавантажена інформаційна система «Страхова компанія».
21. Високонавантажена інформаційна система «Весільний салон».
22. Високонавантажена інформаційна система «Кур’єрське агентство».
23. Високонавантажена інформаційна система «Аптека».
24. Високонавантажена інформаційна система «Туристична фірма».
25. Високонавантажена інформаційна система «Перукарня».
26. Високонавантажена інформаційна система «Фітнес центр».
27. Високонавантажена інформаційна система «Оптово-роздрібний продаж товарів».
28. Тема, обрана студентом самостійно за узгодженням з викладачем.

27
ДОДАТОК Г
Типи даних СУБД MySQL

СУБД MySQL підтримує такі типи даних для полів таблиць: числові (точні
й наближені числові типи); рядкові; календарні; NULL (значення, що вноситься
в поле таблиці та позначає відсутність інформації). Числові типи даних СУБД
MySQL подані в табл. Г.1. У таблиці Г.1 використовуються наступні позначення:
«[ ]» – необов’язкове оголошення атрибута типу; атрибут UNSIGNED задає
числове значення без знака; атрибут ZEROFILL задає відображення нулів у
незначущих розрядах. Якщо зазначений атрибут ZEROFILL, то MySQL
автоматично додає атрибут UNSIGNED; «M» – визначає загальну кількість
значущих розрядів числа (точність), включаючи точку; «D» – визначає кількість
значущих розрядів числа після точки (шкала). Слід пам’ятати, що під час
виконання операцій з числовими величинами, одна з яких належить до типу
UNSIGNED, результат буде завжди позитивним (без знака).

Таблиця Г.1 – Числові типи даних СУБД MySQL


Оголошення типу Об’єм Діапазон
пам’яті
Точні числові дані
TINYINT[(M)] [UNSIGNED] M  1 byte От -128 до 127
[ZEROFILL] 1  M  3 (от -27 до 27 - 1)
TINYINT UNSIGNED 1 byte от 0 до 255
TINYINT(1) UNSIGNED M=1 (от 0 до 28-1)
SMALLINT[(M)] [UNSIGNED] M  2 byte От -32 768 до 32 767
[ZEROFILL] 1  M  5 (от -215 до 215 - 1)
SMALLINT UNSIGNED 2 byte от 0 до 65535
1  M  5 (от 0 до 216 - 1)
MEDIUMINT[(M)] [UNSIGNED] M  3 byte От -223 до 223 – 1
[ZEROFILL] 1  M  5
MEDIUMINT UNSIGNED 3 byte от 0 до 16 777 215
MEDIUMINT(1) UNSIGNED M=1 (от 0 до 224 - 1)
INT[(M)] [UNSIGNED][ZEROFILL] M  4 byte От -231 до 231-1
INTEGER синонім INT 1  M  255
INT UNSIGNED M  4 byte от 0 до 232 – 1
INT(1) UNSIGNED M=1
BIGINT[(M)] [UNSIGNED] M  8 byte От -263 до 263 - 1
[ZEROFILL] (от 0 до 2М)
ВIТ[(М)] (М+7)/8 От 1 до 64 битов
1  M  64
BOOL (синонім BOOLEAN) 1 byte 0 (false) или 1 (true)

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.

Таблиця Г.2 – Рядкові типи даних СУБД MySQL


Оголошення Об’єм пам’яті, Опис
типу розмір
[NATIONAL] L+1 byte Рядок змінної довжини. М – кількість
VARCHAR(M) 1  M  255 символів (byte), (L+1) – фактично
[BINARY] L  M виділяється для зберігання (кінцеві
пробіли видаляються). Не можна змішувати
типи CHAR і VARCHAR. Якщо є поле VARCHAR,
то всі поля типу CHAR будуть подані до
типу VARCHAR.
[NATIONAL] М byte Рядок фіксованої довжини. Незалежно від
CHAR(M) 1  M  255 довжини рядка, для її зберігання викорис-
[BINARY] товуються всі М символів (доповнюються
пробілами). CHAR синонім CHAR(1). CHAR(0)
приймає тільки 2 значення: NULL або " "
BLOB L+2 byte Під час виконання операцій над полями типу
BLOB кодування не враховується.

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. Дати завжди
вказуються в порядку «РІК-МІСЯЦЬ-ДЕНЬ».

Таблиця Г.3 – Календарні типи даних СУБД MySQL


Тип Об’єм пам’яті Діапазон припустимих значень
DATE 3 byte від '1000-01-01' до '9999-12-31'
TIME 3 byte від '-828:59:59' до '828:59:59'
DATATIME 8 byte від '1000-01-01 00:00:00'
до '9999-12-31 00:00:00'
TIMESTAMP(M) 4 byte від '1970-01-01 00:00:00'
до '2038-12-31 59:59:59'
YEAR(2) 1 byte формат YY, діапазон – від (19)70 до (20)69
YEAR(4) 2 byte формат YYYY, діапазон – від 1901 до 2155

30
ДОДАТОК Д
Опис полів таблиць навчальної бази даних

Опис полів таблиць навчальної бази даних поданий у таблиці Д.1.


Таблиця Д.1 – Опис полів таблиць навчальної бази даних
Таблиця Поле таблиці Опис
Client id_client Primary key (клієнт)
Client fk_status Foreign key табл. Status
Client fk_gender Foreign key табл. Gender
Client Surname Прізвище
Client Name, Middlename Ім’я, по батькові
Client Login, Password Логін, пароль
Client birthday День народження
Client mob_phone, city Телефон, місто
Status id_status Primary key (статус користувача)
Status status_name Найменування статусу (user, admin)
Order id_order Primary key (замовлення)
Order fk_client Foreign key табл. Client
Order fk_delivery Foreign key табл. Delivery
Order data Дата замовлення
Order st_initiate Статус замовлення (TRUE –«підтверджений»)
Order st_executed Статус замовлення (TRUE – «виконаний»)
Order address Адреса доставки
Order price_delivery Ціна доставки
Order data_delivery Дата доставки
Order time_delivery Час доставки
Order phone_delivery Телефон клієнта для доставки
Shopping_Cart fk_order Primary key, foreign key табл. Order
Shopping_Cart fk_product Primary key, foreign key табл. Product
Shopping_Cart shop_quantity Кількість товару в замовленні
Catalog id_catalog Primary key (каталог)
Catalog catalog_name Найменування каталогу
Product id_product Primary key (товар)
Product fk_catalog Foreign key табл. Catalog
Product fk_company Foreign key табл. Company
Product name Найменування товару
Product quantity Кількість одиниць на складі
Product price Ціна
Product description Опис товару
Company id_company Primary key ( компанія-виробник)
Company name Найменування компанії
Company country Країна
Company email E-mail
Company info Інформація про компанію
Company business_area Сфера бізнесу
Delivery id_delivery Primary key (доставка)
Delivery status_delivery Статус доставки («замовлене», «виконане»)

31
ДОДАТОК Е
Основні математичні функції СУБД MySQL

Основні математичні функції СУБД MySQL подані в табл. Е.1.

Таблиця Е.1 – Основні математичні функції СУБД MySQL


Синтаксис Опис
ABS (X) Повертає абсолютне значення аргументу X
CEIL (X) Повертає найменше цілочислове значення, яке більше або дорівнює числу Х
(CEIL (X)Х). Приклад: CEIL (12.34)=13
FLOOR (X) Повертає найбільше цілочислове значення, яке менше або дорівнює числу Х
(FLOOR (X)Х). Приклад: FLOOR (12.34)=12
MOD (M,N) Повертає залишок від ділення цілого числа M на ціле число N
POW (X,Y) Повертає значення числа X, зведеного в ступінь Y (XY  POW(X,Y))
RAND (X) Повертає випадкове значення із плаваючою точкою (від 0.0 до 1.0)
ROUND Повертає число X, округлене до визначеного змінною D кількості знаків після
(X, D)
точки (D=0,1,2...)
SIGN (X) Визначає знак числа X. Якщо X від’ємне – повертає мінус один (-1), якщо
додатне – одиницю (1), якщо нуль – повертає нуль (0)
SQRT (X) Обчислює квадратний корінь числа X
TRUNCATE Повертає число X, усічене до визначеною D кількості знаків після точки
(X,D)
(D=0,1,2...). Якщо кількість знаків в X більше D, зайві розряди ігноруються.
D=0,1,...
Якщо менше, те в кінець числа додаються нулі (0).

32
ДОДАТОК Ж
Основні рядкові функції СУБД MySQL

Основні рядкові функції СУБД MySQL подані в табл. Ж.1.

Таблиця Ж.1 – Основні рядкові функції СУБД MySQL


Синтаксис Опис
ASCII (str) Повертає значення ASCII-коду першого символу рядка str.
Для порожнього рядка вертається значення нуль (0).
BIN (N) Приймає десяткове число N і повертає його у двійковому коді
BIT_LENGTH (str) Приймає рядок str і повертає її довжину в бітах
CHAR (N1, N2, … ) Приймає послідовність із ASCII-кодів і повертає рядок,
побудований шляхом об’єднання відповідних до них символів
CHAR_LENGTH (str) Приймає рядок str і повертає число символів у рядку
CHARSET (str) Повертає ім’я кодування, в якому представлений рядок
COLLATION (str) Повертає порядок сортування, встановлений для кодування
аргументу str
CONCAT (str1, str2, Повертає рядок, створений шляхом об’єднання всіх аргументів,
…) кількість яких не обмежена. Якщо хоча б один аргумент
дорівнює NULL, то повертає значення NULL
CONCAT_WS Також поєднує аргументи str1, str2 і т.д., поміщаючи між
(separator, str1, ними роздільник separator. Ігнорує NULL.
str2, …)
CONV (N, from_base, Перетворить число N з однієї системи числення from_base в
to_base) іншу to_base. Параметри from_base і to_base можуть
приймати значення від 2 до 36
ELT (N, str1, str2, Повертає N-й рядок зі списку аргументів str1, str2, … ( для
…) N=1 повертається str1, для N=2 – str2 тощо)
FIELD (str, str1, Знаходить рядок str у списку str1, str2,… і повертає номер
str2, …) рядка в цьому списку (нумерація починається з одиниці «1»)
FIND_IN_SET (str, Шукає входження рядка str у список str_list і повертає
str_list) номер рядка в цьому списку (нумерація починається з 1).
Параметр str_list – набір рядків, розділених комами
INSERT (str, pos, Повертає рядок str, у якому підрядок, що починається з позиції
len, new_str) pos і має довжину len символів, замінений на підрядок
new_str
INSTR (str, substr) Повертає позицію першого входження підрядка substr у рядок
str
LEFT (str, len) Повертає len лівих символів рядка str
LENGTH (str) Повертає довжину рядка str
LOCATE (substr, str Повертає позицію першого входження підрядка substr у рядок
[, pos]) str. У разі наявності необов’язкового аргументу pos, пошук
починається з позиції, зазначеної в цьому аргументі (pos)
LOWER (str) Повертає рядок str, записаний рядковими символами

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. Якщо параметр N0, то функція
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

Основні функції дати й часу СУБД MySQL подані в табл. К.1.

Таблиця К.1 – Основні функції дати й часу СУБД MySQL


Синтаксис Опис
ADDDATE (date, INTERVAL Повертає дату date, до якої доданий часовий інтервал,
expr type) обумовлений параметром expr. Наприклад:
ADDDATE('2009-03-20', INTERVAL 10 DAY)
ADDTIME (expr1, expr2) Повертає результат додавання двох часових значень
CURDATE ( ) Повертає поточну дату у форматі 'YYYY-MM-DD'
CURTIME ( ) Повертає поточний час доби у форматі 'hh:mm:ss'
DATE (datetime) Отримує зі значення datetime дату, ігноруючи години,
хвилини й секунди
DATEDIFF (begin, end) Обчислює різницю в днях між датами begin і end
DATE_FORMAT (date, Форматує дату date у відповідності з рядком format
format)
DAY (date) Повертає порядковий номер дня в місяці (від 1 до 31)
DAYNAME (date) Повертає день тижня у вигляді повної англійської назви
DAYOFWEEK (date) Повертає порядковий номер дня тижня. У західних країнах
тиждень починається з неділі, номер якої 1.
DAYOFYEAR (date) Повертає порядковий номер дня в році (від 1 до 366)
EXTRACT (type FROM Приймає значення дати й часу доби. Повертає частину,
datetime) обумовлену параметром type. Наприклад,
EXTRACT(YEAR FROM '2009-12-31 14:30:15')
FROM_DAYS (N) Приймає число днів N, що пройшли з нульового року, і
повертає дату у форматі 'YYYY-MM-DD'. Використовується
спільно з функцією TO_DAYS(date)
HOUR (datetime) Отримує зі значення datetime години (від 0 до 23)
LAST_DAY (datetime) Приймає значення дати й часу доби. Повертає дату – останній
день поточного місяця
MAKEDATE (year, Приймає рік year і номер дня в році dayofyear. Повертає
dayofyear) дату у форматі 'YYYY-MM-DD'
MAKETIME (hour, minute, Приймає години hour, хвилини minute і секунди second.
second) Повертає час доби у форматі 'hh:mm:ss'
MINUTE (datetime) Отримує зі значення datetime хвилини (від 0 до 59)
MONTH (datetime) Повертає числове значення місяця року (від 1 до 12)
MONTHNAME (datetime) Повертає ім’я місяця у вигляді повної англійської назви
NOW ( ) Повертає поточну дату й час у форматі 'YYYY-MM-DD
hh:mm:ss'
PERIOD_ADD (period, N) Додає N місяців до значення дати period. Аргумент period
має бути представлений у числовому форматі YYYYMMDD або
YYMM

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

Основні інформаційні функції СУБД MySQL подані в табл. Л.1

Таблиця Л.1 – Інформаційні функції СУБД MySQL


Синтаксис Опис
BENCHMARK() Тестування скалярних виразів (неодноразове виконання виразу)
CHARSET() Повертає набір символів кодування аргументу
COERCIBILITY() Повертає значення коерцитивності сортування аргументу рядка
COLLATION() Повертає кодування для сортування аргументу рядка
CONNECTION_ID() Повертає ідентифікатор з’єднання (ідентифікатор сесії) для
підключення
CURRENT_USER() Повертає ідентифіковане ім’я користувача й ім’я хосту
DATABASE () Повертає ім’я поточної бази даних (поточної сесії)
FOUND_ROWS () Повертає для SELECT з інструкцією LIMIT кількість рядків, які
будуть відібрані, з урахуванням обмеження LIMIT
LAST_INSERT_ID() Повертає значення поля AUTOINCREMENT для останнього INSERT
ROW_COUNT () Повертає кількість оновлених (видалених) рядків
SCHEMA () Синонім для функції DATABASE ()
SESSION_USER () Синонім для функції USER ()
SYSTEM_USER () Синонім для функції USER ()
USER () Повертає ім’я користувача й ім’я хосту, що надається сервером
MySQL клієнту
VERSION () Повертає версію сервера MySQL

37
ДОДАТОК М
Логічні оператори СУБД MySQL

Логічні оператори СУБД MySQL подані в табл. М.1.

Таблиця М.1 – Логічні оператори мови SQL


Оператор Приклад Значення
AND n AND m Логічне AND (логічне множення).
n m n AND m n m n AND m
FALSE FALSE FALSE NULL FALSE FALSE
FALSE TRUE FALSE NULL TRUE NULL
TRUE FALSE FALSE FALSE NULL FALSE
TRUE TRUE TRUE TRUE NULL NULL
NULL NULL NULL

OR n OR m Логічне OR (логічне додавання).


n m n OR m n m n OR m
FALSE FALSE FALSE NULL FALSE NULL
FALSE TRUE TRUE NULL TRUE TRUE
TRUE FALSE TRUE FALSE NULL NULL
TRUE TRUE TRUE TRUE NULL TRUE
NULL NULL NULL

XOR n XOR m Логічне XOR (OR, що виключає)


n m n XOR m n m n XOR m
FALSE FALSE FALSE NULL FALSE NULL
FALSE TRUE TRUE NULL TRUE NULL
TRUE FALSE TRUE FALSE NULL NULL
TRUE TRUE FALSE TRUE NULL NULL
NULL NULL NULL

NOT NOT n Логічне NOT (логічне заперечення, інверсія)


n NOT n
FALSE TRUE
TRUE FALSE
NULL NULL

Прийняті позначення TRUE=1, FALSE=0

38
Навчальне видання

МЕТОДИЧНІ ВКАЗІВКИ
до практичних занять з дисципліни
«ПРОЕКТУВАННЯ ВИСОКОНАВАНТАЖЕНИХ
СИСТЕМ ЗБЕРІГАННЯ ДАНИХ»
для студентів усіх форм навчання спеціальності
122 – «Комп’ютерні науки»
за освітньо-професійною програмою
«Комп’ютерні науки та технології»

Упорядники: КОЛЕСНИК Людмила Володимирівна,


КОВАЛЕНКО Андрій Іванович,
РЕШЕТНІК Віктор Михайлович,
СИТНІКОВ Дмитро Едуардович

Відповідальний випусковий І.В. Грібеннік

Редактор О.Г. Троценко


Комп’ютерна верстка Н.Е. Сіпатова
План 2020 (перше півріччя), п.15

Підп. до друку 19.12.2019. Формат 60х84 1/16. Спосіб друку – ризографія


Умов.друк. 9,3 арк. Облік вид. арк. 8,2 Тираж 25 прим.
Зам. № 1-14 Ціна договірна

ХНУРЕ. Україна. 61166, Харків, просп. Науки, 14


Віддруковано в редакційно-видавничому відділі ХНУРЕ
61166, Харків, просп. Науки, 14

Вам также может понравиться