
SUBD Labs 8-13
.pdfЛабораторна робота №8
з курсу “СУБД” на тему:
“Запити на вибір даних із впорядкуванням та групуванням результатів”
Мета роботи: Розробити SQL-запити для вибору записів з однієї чи кількох таблиць в т. ч. із застосуванням: впорядкування результатів за значеннями одного і декількох полів, впорядкування результатів за зростанням і спаданням, групуванням результатів за значеннями одного чи декількох полів.
Короткі теоретичні відомості.
Для впорядкування та групування результатів разом з командою SELECT використовують наступні директиви.
ORDER BY {ім’я_поля | синонім | позиція_поля} [ASC | DESC] [, ...]
Задає порядок сортування значень у результатах запиту за вказаним полем. ASC – за зростанням, DESC – за спаданням. За замовчуванням сортування відбувається за зростанням значень. Поля можна вказувати за назвою, псевдонімом або номером позиції поля у таблиці.
GROUP BY {ім’я_поля | синонім | позиція_поля} [ASC | DESC] [HAVING
умова] [WITH ROLLUP] [, ...]
Групує (і одночасно сортує) рядки за вказаними полями. Поля можна вказувати за іменами, синонімами або порядковими номерами в таблиці.
HAVING вказує умову відбору для групи з використанням як агрегатних так і не агрегатних виразів. Дає можливість застосування до значень полів агрегатних функцій (COUNT, AVG, MIN, MAX тощо) при відборі чи групуванні рядків. Після слова WHERE ці функції не працюють, однак у всіх інших випадках слід використовувати саме WHERE.
WITH ROLLUP додає до результатів запиту рядок із підсумковим значенням для всіх груп.

Хід роботи.
Розробимо та виконаємо такі 3 запити до бази даних.
1.Вивести перелік користувачів із псевдонімом, що містить "user" в алфавітному порядку.
2.Вивести перелік 5 найновіших користувачів системи.
3.Вивести всі повідомлення, згрупувавши їх за категоріями.
1. Запит вибору записів з таблиці Author із використанням сортування:
SELECT authorID, login FROM author WHERE login LIKE '%user%'
ORDER BY login ASC;
Результати запиту:
2. Запит вибору записів з таблиці Author з використанням зворотнього сортування:
SELECT login FROM author ORDER BY created DESC LIMIT 5;
Результати запиту:
3. Запит вибору повідомлень із використанням групування за категоріями. Для кожної категорії буде відображатись останнє повідомлення у ній.
Вивести всі повідомлення та їх категорії:
SELECT message, message.messageID, cname FROM (message INNER JOIN message_category)
INNER JOIN category
ON message.messageID=message_category.messageID
AND message_category.categoryID=category.categoryID;

Результати запиту:
Тепер згрупуємо повідомлення за категоріями:
SELECT cname, message, message.messageID AS mID FROM (message INNER JOIN message_category)
INNER JOIN category
ON message.messageID=message_category.messageID
AND message_category.categoryID=category.categoryID
GROUP BY cname;
Результати запиту:
Висновок: на цій лабораторній роботі було розглянуто методи вибору даних з таблиць БД з використанням сортування та групування. Було проведено вибір даних із таблиць
Author, Message та Category.
Лабораторна робота №9
з курсу “СУБД” на тему:
“Аналітичні та підсумкові запити”
Мета роботи: Розробити SQL запити для вибору записів з однієї чи кількох таблиць із застосуванням агрегатних функцій для отримання підсумкових значень полів.
Короткі теоретичні відомості.
Для побудови аналітичних та підсумкових запитів на SQL використовують директиву GROUP BY, а також агрегатні функції. Основні агрегатні функції подані в таблиці. Аргументами функцій можуть бути як задані множини значень, так і результати підзапиту.
|
|
|
|
|
Функція (оператор) |
|
Опис |
|
|
|
|
|
MAX(), MIN() |
|
Знаходить максимальне, або мінімальне значення для |
|
|
заданих аргументів. |
|
|
|
|
|
|
|
|
|
|
AVG() |
|
Знаходить середнє значення для заданих аргументів. |
|
|
|
|
|
AVG(DISTINCT ...) |
|
Знаходить середнє значення не враховуючи повтори. |
|
|
|
|
|
SUM() |
|
Обчислює суму значень. |
|
|
|
|
|
SUM(DISTINCT ...) |
|
Обчислює суму різних значень. |
|
|
|
|
|
COUNT() |
|
Рахує кількість рядків, які повертає запит. |
|
|
|
|
|
COUNT(DISTINCT …) |
|
Рахує кількість різних значень. |
|
|
|
|
|
BIT_AND(), BIT_OR() |
|
Повертає побітове "і", "або" для аргументів. |
|
|
|
|
|
STD(), STDDEV_POP() |
|
Обчислює значення стандартного відхилення для |
|
|
аргументів. |
|
|
|
|
|
|
|
|
|
|
VAR_POP() |
|
Обчислює значення дисперсії для аргументів. |
|
|
|
|
Для застосування агрегатних функцій SUM або AVG з часовими типами даних потрібно проводити двосторонню конвертацію типів за допомогою спеціальних функцій, наведених нижче.
TO_DAYS() – перевести дату у число, що означає кількість днів починаючи з 0-го року. FROM_DAYS() – перевести кількість днів у дату.
TIME_TO_SEC() – перевести значення часу у кількість секунд. SEC_TO_TIME() – перевести кількість секунд у час.
Наприклад,
SELECT FROM_DAYS(SUM(TO_DAYS(дата))) FROM таблиця;

Хід роботи.
Для досягнення мети роботи, реалізуємо 4 запити до бази даних.
1.Визначити кількість повідомлень у кожній категорії.
2.Вивести кількість нових користувачів, повідомлень і коментарів за кожен місяць.
3.Визначити середню довжину повідомлень для кожного користувача.
4.Визначити найактивнішого в кожному місяці користувача.
1. Визначити кількість повідомлень у кожній категорії.
SELECT cname AS category, COUNT(message.messageID) AS messages FROM (message INNER JOIN message_category) INNER JOIN category ON message.messageID=message_category.messageID
AND message_category.categoryID=category.categoryID
GROUP BY cname;
Результати запиту:
2. Вивести кількість нових користувачів, повідомлень і коментарів за кожен місяць. Для кожного місяця і року буде окремо обчислено кількість нових авторів, повідомлень та коментарів. Для цього використано групування за полями year i month з опцією підведення підсумків WITH ROLLUP.
SELECT YEAR(created) AS year, MONTHNAME(created) AS month, COUNT(login) AS users
FROM author GROUP BY year, month WITH ROLLUP;
SELECT YEAR(posted) AS year, MONTHNAME(posted) AS month, COUNT(messageID) AS messages
FROM message GROUP BY year, month WITH ROLLUP;
SELECT YEAR(posted) AS year, MONTHNAME(posted) AS month, COUNT(commentID) AS comments
FROM comment GROUP BY year, month WITH ROLLUP;

Результати запитів:
3. Визначити середню довжину повідомлень для кожного користувача.
SELECT login AS user, AVG(CHAR_LENGTH(message)) AS avgmessage
FROM author INNER JOIN message ON author.authorID=message.authorID
GROUP BY user;
Результати запиту:
4. Визначити найактивнішого за останній місяць користувача.
Рейтинг активності буде визначатись за формулою: к-сть повідомлень*2 + к-сть коментарів. Умова відбору WHERE буде відбирати тільки ті повідомлення і коментарі, які були написані за попередній місяць (MONTH(CURRENT_DATE)-1). Групування за псевдонімом автора потрібне для агрегатного обчислення рейтингу кожного автора.
SELECT login AS bestauthor, (COUNT(DISTINCT message.messageID) *2 + COUNT(DISTINCT comment.commentID)) AS rating
FROM (author INNER JOIN message) INNER JOIN comment ON author.authorID = message.authorID AND author.authorID = comment.authorID
WHERE MONTH(message.posted)=(MONTH(CURRENT_DATE)-1) AND MONTH(comment.posted)=(MONTH(CURRENT_DATE)-1)
GROUP BY login ORDER BY rating DESC LIMIT 1;
Результат запиту:
Висновок: на цій лабораторній роботі було розглянуто методи застосування агрегатних функцій до результатів вибору даних з таблиць БД.
Лабораторна робота №10
з курсу “СУБД” на тему:
“Написання збережених процедур на мові SQL”
Мета роботи: Навчитися розробляти та виконувати збережені процедури та функції у
MySQL.
Короткі теоретичні відомості.
Більшість СУБД підтримують використання збережених послідовностей команд для виконання часто повторюваних, однотипних дій над даними. Такі збережені процедури дозволяють спростити оброблення даних, а також підвищити безпеку при роботі з базою даних, оскільки в цьому випадку прикладні програми не потребують прямого доступу до таблиць, а отримують потрібну інформацію через процедури.
СУБД MySQL підтримує збережені процедури і збережені функції. Аналогічно до вбудованих функцій (типу COUNT), збережену функцію викликають з деякого виразу і вона повертає цьому виразу обчислене значення. Збережену процедуру викликають за допомогою команди CALL. Процедура повертає значення через вихідні параметри, або генерує набір даних, який передається у прикладну програму.
Синтаксис команд для створення збережених процедур описано нижче.
CREATE
[DEFINER = { користувач | CURRENT_USER }] FUNCTION назва_функції ([параметри_функції ...]) RETURNS тип
[характеристика ...] тіло_функції
CREATE
[DEFINER = { користувач | CURRENT_USER }]
PROCEDURE назва_процедури ([параметри_процедури ...]) [характеристика ...] тіло_процедури
Аргументи:
DEFINER
Задає автора процедури чи функції. За замовчуванням – це CURRENT_USER.
RETURNS
Вказує тип значення, яке повертає функція.
тіло_функції, тіло_процедури
Послідовність директив SQL. В тілі процедур і функцій можна оголошувати локальні змінні, використовувати директиви BEGIN ... END, CASE, цикли тощо. В тілі процедур також можна виконувати транзакії. Тіло функції обов’язково повинно містити команду RETURN і повертати значення.
параметри_процедури:
[ IN | OUT | INOUT ] ім’я_параметру тип
Параметр, позначений як IN, передає значення у процедуру. OUT-параметр передає значення у точку виклику процедури. Параметр, позначений як INOUT, задається при виклику, може бути змінений всередині процедури і зчитаний після її завершення. Типом параметру може бути будь-який із типів даних, що підтримується MySQL.
параметри_функції:
ім’я_параметру тип
У випадку функцій параметри використовують лише для передачі значень у функцію.
При створенні процедур і функцій можна вказувати їхні додаткові характеристики.
характеристика:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER}
| COMMENT 'короткий опис процедури'
DETERMINISTIC
Вказує на те, що процедура обробляє дані строго визначеним (детермінованим) чином. Тобто, залежно від вхідних даних, процедура повертає один і той самий результат. Недетерміновані процедури містять функції типу NOW() або RAND(), і результат їх виконання не можна передбачити. За замовчуванням всі процедури і функції є недетермінованими.
CONTAINS SQL | NO SQL
Вказує на те, що процедура містить (за замовчуванням), або не містить директиви SQL.
READS SQL DATA
Вказує на те, що процедура містить директиви, які тільки зчитують дані з таблиць.
MODIFIES SQL DATA
Вказує на те, що процедура містить директиви, які можуть змінювати дані в таблицях.
SQL SECURITY
Задає рівень прав доступу, під яким буде виконуватись процедура. DEFINER – з правами автора процедури (задано за замовчуванням), INVOKER – з правами користувача, який викликає процедуру. Щоб запускати збережені процедури і функції, користувач повинен мати права EXECUTE.
При створенні процедур і функцій у командному рядку клієнта MySQL, потрібно перевизначити стандартний символ завершення вводу директив ";", щоб мати можливість ввести всі директиви процедури. Це робиться за допомогою команди DELIMITER. Наприклад,
DELIMITER |
означає, що завершення вводу процедури буде позначатись символом "|".
Нижче наведено синтаксис додаткових директив MySQL, які дозволяють розробляти нескладні програми на мові SQL.
DECLARE назва_змінної тип_змінної [DEFAULT значення_за_замовчуванням]
Оголошення змінної заданого типу.
SET назва_змінної = вираз
Присвоєння змінній значення.
IF умова THEN директиви
[ELSEIF умова THEN директиви] ...
[ELSE директиви2] END IF
Умовний оператор. Якщо виконується вказана умова, то виконуються відповідні їй директиви, в протилежному випадку виконуються директиви2.
CASE вираз
WHEN значення1 THEN директиви1
[WHEN значення2 THEN директиви2] ...
[ELSE директиви3] END CASE
Оператор умовного вибору. Якщо вираз приймає значення1, виконуються директиви1, якщо приймає значення2 – виконуються директиви2, і т.д. Якщо вираз не прийме жодного зі значень, виконуються директиви3.
[мітка:] LOOP
директиви
END LOOP
Оператор безумовного циклу. Вихід з циклу виконується командою LEAVE мітка.
REPEAT
директиви
UNTIL умова END REPEAT
WHILE умова DO
директиви
END WHILE
Оператори REPEAT і WHILE дозволяють організувати умовні цикли, які завершуються при виконанні деякої умови.