Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

SUBD Labs 8-13

.pdf
Скачиваний:
2
Добавлен:
13.08.2024
Размер:
519.56 Кб
Скачать

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

Соседние файлы в предмете Системы управления базами данных