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

SUBD Labs 8-14

.pdf
Скачиваний:
37
Добавлен:
12.02.2016
Размер:
433.06 Кб
Скачать

Лабораторна робота №8

з курсу “СУБД” на тему:

“Запити на вибір даних за складними критеріями”

Мета роботи: Розробити SQL-запити для вибору даних з кількох таблиць із застосуванням у критеріях вибірки функцій MySQL, в т. ч. LIKE, BETWEEN, IS NULL, IS NOT NULL, IN (…), NOT IN (…), кванторів ALL, SOME (ANY), EXISTS.

Короткі теоретичні відомості.

Нижче описано основні функції порівняння, які можна використовувати при формуванні складних критеріїв вибору.

 

Функція

 

Опис

 

STRCMP(рядок1, рядок2)

 

Порівнює два рядки. Повертає значення 0 (False) якщо

 

 

рядки однакові, -1 якщо перший рядок менший за

 

 

 

другий, і 1 (True) в усіх інших випадках.

 

LIKE рядок

 

Порівняння з рядком-шаблоном. В шаблоні можна

 

 

використовувати знаки % (довільні символи) і _

 

 

 

(довільний символ).

 

REGEXP рядок

 

Порівняння з рядком з використанням регулярних

 

 

виразів. Функція-синонім – RLIKE.

 

 

 

 

 

 

 

 

MATCH (поля) AGAINST (рядок)

 

Здійснює пошук рядка у вказаних текстових полях

 

 

таблиці. (Тільки для MyISAM-таблиць.)

 

 

 

 

 

BETWEEN ... AND ...

 

Повертає 1, якщо значення належить даному діапазону.

 

 

 

 

 

NOT BETWEEN ... AND ...

 

Повертає 1, якщо значення не належить діапазону.

 

 

 

 

 

 

 

Перевірка належності множині. Повертає 1, якщо

 

IN(арг1, арг2, ...)

 

значення співпадає хоча б із одним аргументом, і 0 – у

 

 

протилежному випадку. Повертає NULL, якщо значення

 

 

 

є NULL, або якщо співпадіння не знайдено, а один із

 

 

 

аргументів є NULL.

 

NOT IN(арг1, арг2, ...)

 

Повертає 1, якщо значення не міститься у множині

 

 

аргументів, і 0 – у протилежному випадку. Повертає

 

 

 

NULL аналогічно до функції IN().

 

 

 

 

 

IS NULL, IS NOT NULL

 

Перевірка визначеності значення.

 

 

 

 

 

LEAST(арг1, арг2, ...)

 

Повертає мінімальне значення серед аргументів.

 

 

Повертає NULL, якщо хоча б один із аргументів є NULL.

 

 

 

 

 

 

 

 

GREATEST(арг1, арг2, ...)

 

Повертає максимальне значення серед аргументів.

 

 

Повертає NULL, якщо хоча б один із аргументів є NULL.

 

 

 

 

 

COALESCE(арг1, арг2, ...)

 

Повертає перше не NULL значення серед аргументів.

 

 

 

 

Для формування критеріїв вибору та підзапитів також використовують наступні оператори порівняння:

=

Оператор перевірки рівності двох виразів. Якщо відбувається порівняння двох не NULL значень, то повертає значення 1 (True) коли обидва вирази рівні, інакше результатом є значення 0 (False). Якщо хоча б один з виразів приймає значення NULL, то результатом є значення NULL.

<=>

Перевірка рівності виразів, яке враховує NULL значення. Повертає 1, якщо обидва вирази приймають значення NULL, або рівні значення. Повертає 0, якщо один із виразів приймає значення NULL, або значення виразів не рівні.

>, >=

Порівняння двох виразів. Результатом є 1, якщо ліве значення більше (більше рівне) ніж праве, інакше результатом є 0. Якщо хоча б один з виразів приймає значення NULL, то результатом теж стає NULL.

<, <=

Порівняння двох виразів. Результатом є 1, якщо ліве значення менше (менше рівне) ніж праве, інакше результатом є 0. Якщо хоча б один з виразів приймає значення NULL, то результатом теж є NULL.

!=, <>

Перевірка на не рівність. Результат набуває значення 1, якщо ліве значення менше або більше ніж праве, інакше результатом є 0. Якщо хоча б один з виразів приймає значення NULL, то результатом теж є NULL.

ALL, SOME, ANY

Оператори, які можна використовувати після операторів порівняння. Задають необхідність виконання оператора хоча б для одного (SOME, ANY) чи всіх (ALL) елементів, отриманих в результаті підзапиту. На відміну від функцій IN(), NOT IN() оператори не працюють зі списками значень.

[NOT] EXISTS

Оператор, який використовують після ключового слова WHERЕ. Повертає 1, якщо підзапит повертає хоча б одне визначене значення, і 0 – у протилежному випадку.

Хід роботи.

Потрібно розробити і виконати такі 4 запити.

1.Вибрати всі повідомлення з таких категорій: blogentry, news.

2.Визначити користувачів, які не написали жодного повідомлення.

3.Визначити користувачів, які не написали жодного повідомлення чи коментаря.

4.Визначити користувачів, паролі яких не відповідають вимогам безпеки (менші за 8 символів або не містять цифр).

1. Вибрати всі повідомлення з таких категорій: blogentry, news.

SELECT message.message, message.messageID

FROM (message INNER JOIN message_category) INNER JOIN category ON message.messageID=message_category.messageID

AND message_category.categoryID=category.categoryID WHERE cname = 'blogentry' OR cname = 'news';

Результат запиту:

2. Визначити користувачів, які не написали жодного повідомлення.

SELECT author.login FROM author

WHERE NOT EXISTS

(SELECT * FROM message WHERE message.authorID = author.authorID);

Результат запиту:

3. Визначити користувачів, які не написали жодного повідомлення чи коментаря.

SELECT author.login FROM author

WHERE NOT EXISTS (SELECT * FROM message WHERE message.authorID = author.authorID)

AND NOT EXISTS (SELECT * FROM comment WHERE comment.authorID = author.authorID);

Результат запиту:

4. Визначити користувачів, паролі яких не відповідають вимогам безпеки (менші за 8 символів або не містять цифр).

SELECT login, AES_DECRYPT(password, 'key-key') AS pass FROM author

WHERE CHAR_LENGTH(AES_DECRYPT(password, 'key-key'))<8 OR AES_DECRYPT(password, 'key-key') NOT REGEXP '[0-9]';

Результат запиту:

Висновок: на цій лабораторній роботі було розглянуто методи вибору даних з таблиць БД з використанням складних критеріїв вибору та проведено вибір із таблиць Author, Comment, Message, Category.

Лабораторна робота №9

з курсу “СУБД” на тему:

“Запити на вибір з таблиць бази даних із впорядкуванням та групуванням результатів”

Мета роботи: Розробити SQL-запити для вибору записів з однієї чи кількох таблиць в т. ч. із застосуванням: впорядкування результатів за значеннями одного і декількох полів, впорядкування результатів за зростанням і спаданням, групуванням результатів за значеннями одного чи декількох полів.

Короткі теоретичні відомості.

Для впорядкування та групування результатів запитів використовують наступні директиви.

ORDER BY {ім’я_поля | синонім | позиція_поля} [ASC | DESC] [, ...]

Задає порядок сортування значень у результатах запиту за вказаним полем. ASC – за зростанням, DESC – за спаданням. Поля можна вказувати за назвою, псевдонімом або номером позиції поля у таблиці.

GROUP BY {ім’я_поля | синонім | позиція_поля} [ASC | DESC] [HAVING

умова] [WITH ROLLUP] [, ...]

Групує (і одночасно сортує) рядки за вказаними полями. HAVING вказує умову відбору для групи з використанням як агрегатних так і не агрегатних виразів. 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.

Лабораторна робота №10

з курсу “СУБД” на тему:

“Аналітичні та підсумкові запити”

Мета роботи: Розробити 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(message.messageID) *2 + COUNT(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;

Результат запиту:

Висновок: на цій лабораторній роботі було розглянуто методи застосування агрегатних функцій до результатів вибору даних з таблиць БД.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]