Uploaded by Микола Сисюк

Lab#2

advertisement
Лабораторна робота №2
з курсу “ОБДЗ”
на тему:
Написання SQL-сценаріїв для створення БД
Мета роботи: Побудувати фізичну модель бази даних; визначити типи, розмірності та
обмеження атрибутів; визначити обмеження таблиць; розробити SQL-сценарії для
створення спроектованих таблиць. Розробити SQL запити для зміни структури таблиць бази
даних (включення нових полів, вилучення полів таблиць, зміни опису полів, зміни
обмежень); застосовувати операції маніпулювання даними в БД.
Хід роботи.
Створення фізичної моделі бази даних - це наступний етап після логічного проєктування, де
ви перетворюєте концептуальну схему в реальну структуру бази даних. Операції
маніпулювання даними в базах даних дозволяють додавати, змінювати та видаляти дані в
таблицях.
Кроки та інструкції для створення фізичної моделі БД (теоретичні відомості до виконання у
додатку 1):
1. Вибір Системи Управління БД (СУБД):
a. Виберіть СУБД, яка найкраще відповідає вашим потребам (наприклад, MySQL,
PostgreSQL, SQL Server, Oracle тощо).
2. Створення Таблиць:
a. Для кожної сутності з логічної моделі створіть таблицю у фізичній моделі.
b. Визначте типи даних для кожного атрибута (наприклад, INT, VARCHAR, DATE
тощо).
c. Встановіть обмеження NULL або NOT NULL для кожного атрибута, як це
вимагається.
3. Додавання Зовнішніх Ключів:
a. Додайте зовнішні ключі у таблиці, які встановлюють зв'язки між сутностями.
b. Забезпечте належне індексування для зовнішніх ключів для покращення
продуктивності запитів.
4. Створення Індексів:
a. Визначте поля, за якими буде виконуватися частий пошук або сортування.
b. Створіть індекси для цих полів, щоб прискорити виконання запитів.
5. Визначення Обмежень Цілісності:
a. Додайте обмеження цілісності, такі як PRIMARY KEY, UNIQUE, CHECK, для
забезпечення правильності та унікальності даних.
6. Оптимізація Даних:
a. Перегляньте таблиці та атрибути для можливостей оптимізації даних, таких як
нормалізація або денормалізація в залежності від вимог.
7. Реалізація:
a. Створіть фізичну модель в обраній СУБД.
b. Розгорніть базу даних на сервері.
8. Під час створення БД за допомогою SQL-сценарію фізичну БД заповнити пробними
даними (INSERT).
9. Застосувати оператори UPDATE, DELETE, TRUNCATE, MERGE для внесення змін у дані.
10. Підготувати звіт до лабораторної роботи та завантажити у ВНС предмету
https://vns.lpnu.ua/course/view.php?id=7897.
11. Захистити лабораторну роботу, продемонструвавши викладачу знання SQL-сценаріїв
у проектуванні фізичної моделі БД.
Створення фізичної моделі - це важливий крок у створенні ефективної та добре налаштованої
бази даних. Він вимагає уваги до деталей, розуміння вимог користувачів та забезпечення
надійності та продуктивності системи.
Посилання на ресурси проектування та розробки БД:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
https://www.dbdesigner.net/
https://dev.mysql.com/downloads/installer/
https://cloud.ibm.com/catalog/services/db2
https://dev.mysql.com/downloads/workbench/
https://www.microsoft.com/en-us/sql-server/sql-server-downloads
https://www.postgresql.org/download/
https://www.w3schools.com/sql/
https://learn.microsoft.com/en-us/sql/?view=sql-server-ver16
https://docs.microsoft.com/learn/
https://www.postgresqltutorial.com/
https://www.mysqltutorial.org/
https://www.mssqltips.com/
https://sqlzoo.net/
http://sqlfiddle.com/
https://sqliteonline.com/
Рекомендовані джерела:
•
•
•
SQL | DDL, DQL, DML, DCL and TCL Commands - GeeksforGeeks
Primary and Foreign Key Constraints - SQL Server | Microsoft Learn
Constraints in SQL Server: SQL NOT NULL, UNIQUE and SQL PRIMARY KEY (sqlshack.com)
Додаток 1
Теоретичні відомості.
Щоб створити нову базу даних у командному рядку клієнта MySQL (mysql.exe) слід
виконати команду CREATE DATABASE, опис якої подано нижче. Тут і надалі, квадратні дужки
позначають необов’язковий аргумент команди, символ "|" позначає вибір між аргументами.
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] ім’я_бази
[[DEFAULT] CHARACTER SET кодування]
[[DEFAULT] COLLATE набір_правил]
ім’я_бази – назва бази даних (латинські літери і цифри без пропусків); кодування –
набір символів і кодів (koi8u, latin1, utf8, cp1250 тощо); набір_правил
– правила
порівняння рядків символів (див. результат команди
show collation).
Нижче наведені деякі допоміжні команди для роботи в СУБД MySQL. Кожна команда
і кожен запит в командному рядку повинні завершуватись розділяючим символом ";".
1. Перегляд існуючих баз даних:
SHOW DATABASES
2. Вибір бази даних для подальшої роботи:
USE DATABASE ім’я_бази
3. Перегляд таблиць в базі даних:
SHOW TABLES [FOR ім’я_бази]
4. Перегляд опису таблиці в базі:
DESCRIBE ім’я_таблиці
5. Виконати набір команд з зовнішнього файлу:
SOURCE назва_файлу
6. Вивести результати виконання подальших команд у зовнішній файл:
\T назва_файлу
Для роботи зі схемою бази даних існують такі основні команди:
ALTER DATABASE – зміна опису бази даних; CREATE
TABLE – створення нової таблиці; ALTER TABLE –
зміна структури таблиці; DELETE TABLE– видалення
таблиці з бази даних;
CREATE INDEX– створення нового індексу (для швидкого пошуку даних);
DROP INDEX– видалення індексу;
DROP DATABASE– видалення бази даних.
Створення таблиці в MySQL та її основні аргументи.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] ім’я_таблиці
[(опис_таблиці,...)]
[додаткові_параметри] ...
[вибірка_даних]
опис_таблиці: назва_поля
опис_поля
| [CONSTRAINT [ім’я_обмеження]] PRIMARY KEY (назва_поля,...) [тип_обмеження]
| {INDEX|KEY} [ім’я_обмеження] (назва_поля,...)[ тип_обмеження]
| [CONSTRAINT [ім’я_обмеження]] UNIQUE [INDEX|KEY]
[ім’я_обмеження](назва_поля,...) [тип_обмеження]
| {FULLTEXT|SPATIAL} [INDEX|KEY] [ім’я_обмеження] (назва_поля,...)
[тип_обмеження]
| [CONSTRAINT [ім’я_обмеження]] FOREIGN KEY
[ім’я_обмеження] (назва_поля,...) опис_зв’язку
| CHECK (вираз)
опис_поля:
тип_даних [NOT NULL | NULL] [DEFAULT значення_за_замовчуванням]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
опис_зв’язку:
REFERENCES ім’я_таблиці (назва_поля, ...) [ON DELETE
дія]
[ON UPDATE дія]
дія:
CASCADE
Одночасне видалення, або оновлення відповідного значення у зовнішній таблиці.
RESTRICT
Аналог NO ACTION. Дія над значенням поля ігнорується, якщо існує відповідне йому
значення у зовнішній таблиці. Опція задана за замовчуванням.
SET NULL
При дії над значенням у первинній таблиці, відповідне значення у зовнішній
таблиці замінюється на NULL.
додаткові_параметри:
{ENGINE|TYPE} [=] тип_таблиці
| AUTO_INCREMENT [=] значення_приросту_лічильника
| AVG_ROW_LENGTH [=] значення
| [DEFAULT] CHARACTER SET [=] кодування
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] набір_правил
| COMMENT [=] 'коментар до таблиці'
| DATA DIRECTORY [=] 'абсолютний шлях'
| DELAY_KEY_WRITE [=] {0 | 1}
| INDEX DIRECTORY [=] 'абсолютний шлях'
| MAX_ROWS [=] значення
| MIN_ROWS [=] значення
| ROW_FORMAT {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
вибірка_даних:
[IGNORE | REPLACE] [AS] SELECT ... (вибір даних з інших таблиць)
вираз:
Логічний вираз, що повертає TRUE або FALSE.
Опис аргументів:
ім’я_таблиці
Назва таблиці. Або назва_бази.назва_таблиці.
тип_таблиці
В MySQL крім типів таблиць MyISAM та InnoDB існують типи MEMORY, BDB, ARCHIVE
тощо.
тип_обмеження
Задає тип індексу для ключового поля: USING {BTREE | HASH |RTREE}.
TEMPORARY
Створення тимчасової таблиці, яка буде знищена після завершення зв’язку з сервером.
CONSTRAINT
Вказує на початок оголошення PRIMARY KEY, UNIQUE, або FOREIGN KEY
обмеження.
NULL | NOT NULL
Директива, що дозволяє/забороняє null-значення для даного поля.
PRIMARY KEY
Вказує, що дане поле буде первинним ключем в таблиці.
UNIQUE
Вказує на те, що в даному полі будуть зберігатися унікальні значення.
FOREIGN KEY ... REFERENCES
Створює зовнішній ключ, зв’язаний із вказаним полем (полями).
AVG_ROW_LENGTH
Приблизне значення середньої довжини рядків зі змінною довжиною.
DATA DIRECTORY
Вказує шлях, за яким таблиця має зберігатись у файловій системі.
CHECKSUM
Якщо параметр = 1, то для рядків таблиці буде рахуватись контрольна сума. Це
сповільнює оновлення таблиці, але робить легшим пошук пошкоджених таблиць.
ROW_FORMAT
Вказує на спосіб зберігання рядків таблиці (залежно від типу таблиці).
FULLTEXT|SPATIAL
Тип індексу (повнотекстовий/просторовий; тільки для таблиць типу MyISAM).
Основні типи даних у СУБД MySQL:
Тип даних
TINYINT[(k)] [UNSIGNED]
BOOL
SMALLINT[(k)] [UNSIGNED]
MEDIUMINT[(k)] [UNSIGNED]
INT[(k)] [UNSIGNED]
BIGINT[(k)] [UNSIGNED]
SERIAL
Опис
Ціле число з k-біт: -127 .. 128. UNSIGNED: 0 .. 255.
Логічний тип (1-бітне число). Число 0 – фальш,
відмінне від нуля – істина.
Ціле число з k-біт: -32768 .. 32767.
UNSIGNED: 0 .. 65535.
Ціле число з k-біт: -8388608 .. 8388607.
UNSIGNED: 0 .. 16777215.
Ціле число з k-біт: -2147483648 .. 2147483647.
UNSIGNED: 0 .. 4294967295.
-9223372036854775808 .. 9223372036854775807.
UNSIGNED: 0 .. 18446744073709551615.
Синонім для типу BIGINT UNSIGNED NOT NULL
AUTO_INCREMENT UNIQUE
TIMESTAMP
Число з плаваючою крапкою, де n – кількість всіх
цифр, m – кількість цифр після крапки.
Від -3.402823466E+38 до -1.175494351E-38
UNSIGNED: 1.175494351E-38 .. 3.402823466E+38
Від -1.7976931348623157E+308 до
-2.2250738585072014E-308
UNSIGNED: від 2.2250738585072014E-308 до
1.7976931348623157E+308.
Число з фіксованою крапкою. n – кількість цифр
(максимально – 65), m – кількість цифр після крапки
(максимально – 30, за замовчуванням – 0).
UNSIGNED: від’ємні значення заборонені.
Дата. Від "1000-01-01" до "9999-12-31".
Дата і час.
Від "1000-01-01 00:00:00" до "9999-12-31 23:59:59".
Часова мітка. Може присвоюватись автоматично.
Від "1970-01-01 00:00:01" до "2038-01-09 03:14:07"
TIME
Час у форматі "HH:MM:SS" (рядок або число).
CHAR[(n)]
Рядок з n-символів (макс. – 255, за замовчуванням – 1).
FLOAT[(n,m)] [UNSIGNED]
DOUBLE[(n,m)] [UNSIGNED]
DECIMAL[(n[,m])]
[UNSIGNED]
DATE
DATETIME
TEXT(n)
Рядок змінної довжини. Для кодування utf8
максимальна довжина складає 21844 символи.
Рядок змінної довжини. Максимальна кількість
однобайтових символів – 65535.
MEDIUMTEXT
16777215 однобайтових символів (16 Мб тексту).
BLOB
Бінарні дані (65535 байт).
MEDIUMBLOB
Бінарні дані (16 Мб)
LONGBLOB
Бінарні дані (4 Гб, залежно від налаштувань системи)
ENUM('знач1','знач2',...)
Перелік значень. Зберігається лише одне.
Множина значень. Зберігається одне, або більше
(максимально – 64).
VARCHAR(n)
SET('знач1','знач2',...)
Можна дати декілька порад щодо розробки схеми бази даних і вибору типів даних. Вони
дозволять уникнути повільного виконання запитів і потреби модифікації таблиць в
майбутньому.
• Слід використовувати якомога менший тип даних для полів таблиць. Наприклад, для
зберігання чисел від 1 до 64 краще використати тип TINYINT(6) замість SMALLINT. Це
впливає на швидкість пошуку і вибірки даних.
• Слід використовувати рядки фіксованої довжини, якщо це можливо. Для цього всі
поля таблиці повинні бути фіксованої довжини. Тобто, варто уникати типів VARCHAR,
TEXT і BLOB. Це пришвидчить вибірку даних з середини рядків, оскільки ці дані будуть
мати фіксовану адресу. При потребі використання полів з типами TEXT або BLOB, їх
можна виділити в окрему таблицю.
• Якщо можливо, варто завжди використовувати поля з обмеженням NOT NULL. Хоча
це може збільшувати об’єм бази на диску.
• MySQL дозволяє використовувати різні типи таблиць в одній базі даних. Слід
використовувати переваги різних типів (MyISAM, INODB тощо) залежно від характеру
майбутнього використання таблиці.
• Потрібно створювати індекси, які пришвидчать пошук і вибірку даних.
• В рідкісних випадках можна денормалізувати схему з метою зменшення кількості
операцій з об’єднання таблиць при складних запитах. Але при цьому ускладнюється
задача збереження цілісності бази даних.
Для зміни структури таблиць використовується наступна директива мови SQL.
Синтаксис:
ALTER [IGNORE] TABLE ім’я_таблиці
опис_зміни [, опис_зміни ...]
опис_зміни:
[додаткові_параметри ...]
| ADD [COLUMN] назва_поля опис_поля
[FIRST | AFTER назва_поля ]
| ADD [COLUMN] (назва_поля опис_поля,...)
| ADD {INDEX|KEY} [ім’я_обмеження] (назва_поля,...)[тип_обмеження]
| ADD [CONSTRAINT [ім’я_обмеження]] PRIMARY KEY (назва_поля,...) [тип_обмеження]
| ADD [CONSTRAINT [ім’я_обмеження]]
UNIQUE [INDEX|KEY] [ім’я_обмеження](назва_поля,...)[тип_обмеження]
| ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [ім’я_обмеження] (назва_поля,...)
[тип_обмеження]
| ADD [CONSTRAINT [ім’я_обмеження]]
FOREIGN KEY [ім’я_обмеження] (назва_поля,...) опис_зв’язку
| ALTER [COLUMN] назва_поля {SET DEFAULT значення | DROP DEFAULT}
| CHANGE [COLUMN] стара_назва_поля нова_назва_поля опис_поля
[FIRST|AFTER назва_поля]
| MODIFY [COLUMN] назва_поля опис_поля
[FIRST | AFTER назва_поля]
| DROP [COLUMN] назва_поля
| DROP PRIMARY KEY
| DROP {INDEX|KEY} ім’я_обмеження
| DROP FOREIGN KEY ім’я_обмеження
| RENAME [TO] нова_назва_таблиці
| ORDER BY назва_поля [,назва_поля] ...
| CONVERT TO CHARACTER SET кодування [COLLATE набір_правил]
| [DEFAULT] CHARACTER SET [=] кодування [COLLATE [=] набір_правил]
додаткові_параметри:
{ENGINE|TYPE} [=] тип_таблиці
| AUTO_INCREMENT [=] початкове_значення
| AVG_ROW_LENGTH [=] значення
| [DEFAULT] CHARACTER SET [=] кодування
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] набір_правил
| COMMENT [=] 'коментар до таблиці'
| DELAY_KEY_WRITE [=] {0 | 1}
| MAX_ROWS [=] значення
| MIN_ROWS [=] значення
| ROW_FORMAT {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
Аргументи:
тип_обмеження
Вказує тип індексу для поля: USING {BTREE | HASH | RTREE}.
IGNORE
Ігнорувати помилки дублювання значень в ключових полях, тобто залишати в таблиці
перше значення, і не вставляти дублікат. За замовчуванням, при такій помилці вся дія
над таблицею відміняється.
ALTER назва_поля
Використовується для зміни значення за замовчуванням для поля.
MODIFY назва_поля
Змінити тип поля.
CHANGE назва_поля
Змінити назву і тип поля.
FIRST | AFTER
Змінити розташування поля в таблиці. За замовчуванням, нове поле додається в
кінець таблиці. FIRSTдодасть його на початок; AFTER– одразу після вказаного поля.
DROP назва_поля
Видалення поля, обмеження чи індексу.
ORDER BY
Відсортувати рядки в таблиці за зростанням значень у вказаному полі (полях).
AUTO_INCREMENT
При зміні початкового значення для приросту поля-лічильника, слід вказати значення
більше за ті, які вже містяться в цьому полі.
CONVERT TO
Задає кодування, в яке потрібно перевести таблицю.
RENAME TO
Змінити назву таблиці на вказану. Для зміни назви таблиці, або для переносу таблиці в іншу
базу, також можна використати директиву RENAME TABLE ім’я_бази_1.назва_таблиці_1 TO
ім’я_бази_2.назва_таблиці_2.
Для внесення значень в таблиці використовується директива INSERT.
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] назва_таблиці [(назва_поля,...)]
|{VALUES | VALUE} ({вираз | DEFAULT},...),(...),...
| [SET назва_поля={вираз | DEFAULT}, ...]
| [вибірка_даних]
[ON DUPLICATE KEY UPDATE назва_поля=вираз [, назва_поля=вираз]...]
Аргументи:
VALUES
Задає набір значень, які будуть вставлятися у задані поля таблиці з дотриманням
вказаного у дужках порядку полів. Якщо перелік полів не задано, то значення потрібно
задати для кожного поля таблиці.
DEFAULT
Внесення значення за замовчуванням у вказане поле.
вираз
Константа, змінна або інший вираз (див. далі). Наприклад: поле2=поле1*0.5.
вибірка_даних
Довільна SELECT-директива, результати виконання якої будуть внесені в таблицю.
ON DUPLICATE KEY UPDATE
Якщо при внесенні нового рядка, значення в ключових полях дублюються, то ця
директива дозволяє задати вираз, за яким будуть формуватись нові значення полів наявного
в таблиці (старого) рядка. При цьому, новий рядок не буде внесений в таблицю.
Наступна директива MySQL дозволяє заносити дані в таблицю із зовнішнього файлу.
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'назва_файлу' [REPLACE | IGNORE]
INTO TABLE назва_таблиці [CHARACTER
SET кодування] [{FIELDS |
COLUMNS}
[TERMINATED BY 'рядок_завершення']
[[OPTIONALLY] ENCLOSED BY 'символ'] [ESCAPED
BY 'символ']]
[LINES [STARTING BY 'рядок_початку'] [TERMINATED BY
'рядок_завершення']]
[IGNORE кількість LINES]
Для внесення змін в записи таблиці використовується директива UPDATE.
UPDATE [LOW_PRIORITY] [IGNORE] назва_таблиці
SET назва_поля1={вираз|DEFAULT} [, назва_поля2={вираз|DEFAULT}]... [WHERE
умова_відбору]
[ORDER BY ...]
[LIMIT кількість_рядків]
Аргументи:
SET
Задає список полів, значення яких будуть змінюватись, і відповідні дії над ними.
DEFAULT
Вставка значення по замовчуванню у вказане поле.
WHERE
Вказує умову, за якою відбираються рядки, що підлягають зміні.
ORDER BY
Може вказувати поле, за яким сортувати рядки перед зміною, з метою уникнення
порушення цілісності таблиці.
LIMIT
Обмежує кількість рядків, які будуть змінені.
Для видалення записів з таблиці використовується директива DELETE.
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM назва_таблиці
[WHERE умова_відбору]
[ORDER BY ...]
[LIMIT кількість_рядків]
MERGE (UPSERT): Операція, яка дозволяє виконати INSERT або UPDATE залежно від того, чи
існує вже запис з вказаними ключовими значеннями.
MERGE INTO employees AS target
USING new_data AS source
ON target.employee_id = source.employee_id
WHEN MATCHED THEN
UPDATE SET target.salary = source.salary
WHEN NOT MATCHED THEN
INSERT (employee_id, salary) VALUES (source.employee_id, source.salary);
UPSERT (ON DUPLICATE KEY): Операція вставки або оновлення запису в таблиці на основі
унікального ключа.
INSERT INTO employees (employee_id, salary) VALUES (123, 60000)
ON DUPLICATE KEY UPDATE salary = VALUES(salary);
TRUNCATE: Видаляє всі записи з таблиці, зберігаючи структуру таблиці.
TRUNCATE TABLE employees;
REPLACE: Додає новий запис або замінює існуючий запис на основі унікального ключа.
REPLACE INTO employees (employee_id, salary) VALUES (123, 60000);
Аргументи:
FROM
Вказує таблицю, з якої слід видалити значення.
WHERE
Вказує умову, за якою відбираються рядки, що підлягають видаленню.
ORDER BY
Може вказувати поле, за яким сортувати рядки перед видаленням.
LIMIT
Обмежує кількість рядків, які будуть видалені.
При побудові виразів та запитів, можна використовувати оператори та функції MySQL.
Опишемо основні з них у таблиці.
Функція (оператор)
Опис
AND, OR
Логічне “і” та логічне “або”.
~, &, | , ^
Побітові операції інверсії, логічного “і”, “або”,
“виключного або”.
AVG(), MAX(), MIN()
Повертає середнє, максимальне, або
мінімальне значення для аргументів.
ABS()
POW(Х, У)
Повертає модуль числа.
Повертає число Х у степіні У.
RAND()
Повертає псевдовипадкове число з плаваючою
крапкою.
Перевіряє, чи не входить значення до множини
вказаних значень.
NOT IN()
NULLIF(вираз1, вираз2)
IF(вираз1, вираз2, вираз3)
Повертає NULL, якщо значення рівні між собою.
Повертає вираз2, якщо виконується вираз1.
В протилежному випадку повертає вираз3.
SIN(); COS(); TAN(); COT(); LN()
Повертає значення синуса, косинуса, тангенса,
котангенса, натурального логарифма.
BETWEEN ... AND ...
Перевіряє, чи входить значення у заданий діапазон.
COUNT()
COUNT(DISTINCT)
Рахує кількість рядків, які повертає запит.
Рахує кількість різних значень.
CHAR_LENGTH(рядок)
CONCAT(рядок1, ...)
Повертає кількість символів в аргументі.
Повертає об’єднані рядки.
NOW(),
СURRENT_TIMESTAMP()
Повертає поточну дату і час у форматі
'YYYY-MM-DD HH:MM:SS'.
CURRENT_DATE(),
CURRENT_DATE
Повертає поточну дату.
CURRENT_TIME(),
CURRENT_TIME
Повертає поточний час.
DAYOFMONTH(дата)
MONTH(дата)
Повертає день місяця з отриманої дати.
Повертає номер місяця, присутнього у отриманій даті.
YEAR(дата)
Повертає рік з отриманої дати.
STRCMP(рядок1, рядок2)
LIKE рядок
RLIKE шаблон
MATCH (поля) AGAINST (рядок)
ROW_COUNT()
BENCHMARK(к-сть, вираз)
COMPRESS(рядок_символів),
UNCOMPRESS(рядок_символів)
AES_ENCRYPT(значення, ключ),
AES_DECRYPT(значення, ключ)
MD5(значення)
Порівнює два рядки.
Порівняння з шаблоном. Можна використовувати
% (довільні символи) і _ (довільний символ).
Порівняння з шаблоном, яке підримує регулярні
вирази.
Здійснює пошук рядка у вказаних символьних
полях таблиці. (Тільки для MyISAM-таблиць.)
Рахує кількість рядків, оновлених останнім запитом.
Виконує вираз вказану кількість разів і повертає час
виконання. Замість виразу можна вказати запит, який
повинен повертати максимум одне значення.
Якщо MySQL встановлений з бібліотекою zlib, функції
дозволяють стискати і розпаковувати символьні
рядки.
128-бітне шифрування і дешифрування рядків за
заданим ключем.
Обчислює MD5-хеш заданого рядка.
Додаток 2
Приклад використання операцій SQL
Даталогічна модель вимагає визначення конкретних полів бази даних, їхніх типів,
обмежень на значення, тощо.
На рисунку зображено даталогічну модель проектованої бази даних.
Для зв’язку коментарів і повідомлень встановлено обмеження цілісності «каскадне
оновлення».
Для полів statusу таблицях MESSAGEта COMMENTвизначено такий домен
– (“опубліковане”, “неопубліковане”, “видалене”).
Створення нової бази даних реалізується із застосуванням наступних команд:
CREATE DATABASE MyCMS CHARACTER SET utf8 COLLATE DEFAULT;
CREATE TABLE MyCMS.CATEGORY (
categoryID INT UNSIGNED NOT NULL AUTO_INCREMENT, cname
VARCHAR(39),
PRIMARY KEY (categoryID)
);
CREATE TABLE MyCMS.ROLE (
roleID SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
rolename CHAR(19) NOT NULL, permissions
VARCHAR(255) NOT NULL, PRIMARY KEY (roleID)
);
CREATE TABLE MyCMS.AUTHOR (
authorID INT UNSIGNED NOT NULL AUTO_INCREMENT name
CHAR(99) NOT NULL,
login CHAR(19) NOT NULL,
password CHAR(255) NOT NULL, created
DATETIME NOT NULL, email CHAR(40)
NOT NULL,
profile TEXT,
roleID SMALLINT UNSIGNED NOT NULL, PRIMARY
KEY (authorID),
CONSTRAINT author_role FOREIGN KEY (roleID)
REFERENCES MyCMS.ROLE (roleID) ON DELETE NO ACTION ON UPDATE NO
ACTION
);
CREATE TABLE MyCMS.MESSAGE (
messageID INT UNSIGNED NOT NULL AUTO_INCREMENT,
message TEXT NOT NULL,
authorID INT UNSIGNED NOT NULL, posted
DATETIME NOT NULL,
status ENUM ('published', 'unpublished', 'deleted',) DEFAULT 'published',
rating TINYINT,
attachment BOOL DEFAULT 0,
PRIMARY KEY (messageID),
CONSTRAINT message_author FOREIGN KEY (authorID)
REFERENCES MyCMS.AUTHOR (authorID) ON DELETE NO ACTION ON UPDATE NO
ACTION
);
CREATE TABLE MyCMS.COMMENT (
commentID INT UNSIGNED NOT NULL AUTO_INCREMENT,
messageID INT UNSIGNED NOT NULL,
autorID INT UNSIGNED NOT NULL, text
TEXT NOT NULL,
status ENUM ('published', 'unpublished', 'deleted',) DEFAULT 'published',
posted TIMESTAMP NOT NULL,
PRIMARY KEY (commentID),
CONSTRAINT comment_message FOREIGN KEY (messageID)
REFERENCES MyCMS.MESSAGE (messageID) ON DELETE CASCADE ON UPDATE
CASCADE
);
CREATE TABLE MyCMS.FILE (
fileID INT UNSIGNED NOT NULL AUTO_INCREMENT, messageID
INT UNSIGNED NOT NULL,
authorID INT UNSIGNED NOT NULL, fname
CHAR(39) NOT NULL,
path CHAR(199) NOT NULL, type
CHAR(5) NOT NULL, size INT
UNSIGNED,
UNIQUE UQ_File_Message (fileID, messageID),
PRIMARY KEY (fileID),
CONSTRAINT file_message FOREIGN KEY (messageID)
REFERENCES MyCMS.MESSAGE (messageID) ON DELETE NO ACTION ON UPDATE NO
ACTION,
CONSTRAINT file_author FOREIGN KEY (authorID)
REFERENCES MyCMS.AUTHOR (authorID) ON DELETE NO ACTION ON UPDATE NO
ACTION
);
CREATE TABLE MyCMS.SESSION (
sessionID VARCHAR(255) NOT NULL, authorID
INT UNSIGNED NOT NULL, start TIMESTAMP
NOT NULL,
sessioninfo VARCHAR(255),
CONSTRAINT session_author FOREIGN KEY (authorID)
REFERENCES MyCMS.AUTHOR (authorID) ON DELETE NO ACTION ON UPDATE NO
ACTION
);
CREATE TABLE MyCMS.MESSAGE_CATEGORY (
messageID INT UNSIGNED NOT NULL,
categoryID INT UNSIGNED NOT NULL,
CONSTRAINT cat_category FOREIGN KEY (categoryID)
REFERENCES MyCMS.CATEGORY (categoryID) ON DELETE NO ACTION ON UPDATE NO
ACTION,
CONSTRAINT cat_message FOREIGN KEY (messageID)
REFERENCES MyCMS.MESSAGE (messageID) ON DELETE NO ACTION ON UPDATE NO
ACTION
);
Виконаємо команди: SHOW TABLES; DESCRIBE FILE.
Приклади застосування операцій над схемою бази даних.
1.
2.
3.
4.
5.
Вилучити зв’язок file_author.
Вилучити і змінити поля в таблиці File.
Змінити поле в таблиці Author.
Додати поле і нове обмеження унікальності до таблиці Message.
Змінити тип обмеження цілісності для зв’язку file_message.
1. Видалення зв’язку між таблицями шляхом видалення обмеження для таблиці:
ALTER TABLE MyCMS.FILE
DROP FOREIGN KEY file_author,
DROP INDEX file_author;
Для перевірки результату можна виконати команди SHOW INDEX FROM File, та
SHOW CREATE TABLE File.
2. Видалення поля і зміна розмірності поля в таблиці File:
ALTER TABLE MyCMS.FILE
DROP COLUMN authorID,
MODIFY COLUMN size int(22) NULL;
3. Зробимо поле Name в таблиці Author необов’язковим, і змінимо його розмірність:
ALTER TABLE MyCMS.AUTOR
MODIFY COLUMN name CHAR(60) NULL;
4. Додамо до таблиці Message поле versionID, яке дозволить зберігати різні версії одного
і того ж повідомлення. Спочатку змінимо поле messageID, забравши лічильник
(властивість auto_increment). Після додавання поля versionID, створимо нове
обмеження унікальності для полів (messageID, versionID).
ALTER TABLE MyCMS.MESSAGE
MODIFY messageID INT(32) UNSIGNED NOT NULL,
ADD COLUMN versionID TINYINT(8) UNSIGNED NOT NULL AFTER
messageID,
ADD CONSTRAINT UNIQUE UQ_Message_version (messageID, versionID);
Виконаємо команду DESCRIBE MESSAGE.
5. Змінимо обмеження цілісності file_message так, щоб при видаленні повідомлення, з
бази видалялись записи про всі приєднані до нього файли. Для цього потрібно
видалити обмеження і створити нове, оскільки MySQL не підримує директиви ALTER
CONSTRAINT.
ALTER TABLE MyCMS.FILE
DROP FOREIGN KEY file_message,
ADD CONSTRAINT file_message FOREIGN KEY (messageID)
REFERENCES MyCMS.MESSAGE (messageID) ON DELETE CASCADE;
Для перевірки результату можна виконати команду SHOW CREATE TABLEFile.
6. Внесення нових значень в таблицю Role в режимі одиничного доповнення:
INSERT INTO role VALUES (1, ‘Admin’, ‘full’);
Внесення нових значень в таблицю Role в режимі групового доповнення:
INSERT INTO role
VALUES (NULL, ‘Group1’, ‘read, write, changeown’),
(NULL, ‘Group2’, ‘read, write, changeown’), (NULL, ‘Guest’,
‘read’);
Таблиця ROLE після виконання запиту:
7. Створимо файли з даними для таблиць Author і Message. Значення полів повинні
розділятись символом табуляції, а кожен рядок таблиці повинен починатися з нового
рядка у файлі. Виконаємо дві наступні команди.
LOAD DATA INFILE 'f:\author.tbl' INTO TABLE author LINES TERMINATED BY '\r\n';
LOAD DATA INFILE 'f:\message.tbl' INTO TABLE message LINES TERMINATED BY
'\r\n';
8. Внесення змін в записи таблиці. Змінимо пароль користувача user1 і збільшимо
значення ключового поля на одиницю. Для зміни значень ключа потрібно змінити
порядок сортування рядків, щоб уникнути суперечності.
UPDATE author SET password = ‘user1pass’
WHERE login=’user1’;
UPDATE author SET authorid = authorid + 1
ORDER BY authorid DESC;
Таблиця Author до виконання запитів:
Таблиця Author після виконання запитів:
9.
Запит для вилучення старих повідомлень користувачів з таблиці Message.
DELETE FROM message
WHERE (posted<’2009-02-10’ && authorid!=2);
Таблиця MESSAGE до видалення інформації:
Таблиця MESSAGE після виконання запиту:
Висновок: у цій лабораторній роботі було завершено моделювання і засобами SQL
створено базу даних, що складається з восьми таблиць та було розглянуто методи
модифікації структури таблиць БД засобами SQL та проведено модифікацію полів, зв’язків і
обмежень та способи наповнення і модифікації даних в таблицях БД та проведено
модифікацію даних у таблицях.
Download