- •Varchar [(длмня)], char varying [(длина)],
- •Числовые типы данных
- •Дата и время
- •Неопределенные или пропущенные данные (noll)
- •Используемые термины и обозначения
- •Команды манипулирования данными
- •3.2. Использование подзапросов в insert
- •Создание таблиц базы данных
- •Создание объектов базы данных
- •Зміна структури таблиці
- •Внимание
- •Зміна структури таблиць
- •Заняття 4. Вставка записів у таблиці
- •Ограничение not null
- •2.4. Листинг 2.4. Команда создания таблицы Orders
- •Перегляд окремих записів та окремих полів у таблиці
- •Використання кількох умов відбору записів
- •Ітоги . Що ми узнали про перегляд даних у таблицях
- •Лекція на тему: Оновлення та вилучення записів в субд MySql.
- •3.2. Использование подзапросов в insert
- •Вилучення записів з таблиць
- •Лекція на тему: Вибірка даних з субд MySql.
- •Просте об'єднання двох таблиць
- •Самостійно.
- •Об'єднання трьох і більше таблиць
- •Об'єднання таблиць за остачею
- •Підсумок
- •Лекція на тему: Групування даних. Запити з обчисленнями.
- •Обчислення середнього значення: функція avg
- •Підрахунок кількості записів: функція count
- •Підрахунок суми значень: функція sum()
- •Пошук найбільшого та найменшого значення: функції max та min
Обчислення середнього значення: функція avg
Підрахуйте середню вартість всіх замовлень у таблиці orders бази даних book_shop. Інструкція на запит:
mysql> select avg(Amount) from orders;
Для того, щоб одержати більш детальну інформацію, скористайтеся інструкцією GROUP BY. Це дозволить переглянути середню вартість замовлення по окремих групах, наприклад, за номером клієнта, що дасть інформацію про те, хто з клієнтів робить найбільші замовлення.
Підрахуйте середню вартість всіх замовлень по кожному клієнту окремо.
Інструкція на запит:
mysql> select customerlD, avg(Amount)
-> from orders
-> group by customerlD;
Результат запиту:
customerlD |
avg(Amount) |
1 |
144.000000 |
2 |
42.000000 |
3 |
141.000000 |
Якщо у результатах запиту повинні бути відображені імена клієнтів, а не їх номери, тоді необхідно об'єднати дві таблиці customers та orders. Виконайте такий запит:
niysql> select customers.name, avg(orders.amount)
-> from customers, orders
-> where customers.customer ID = orders.customerID
-> group by orders.customerlD;
Результат запиту:
name |
avg(orders.amount) |
Иван Лваненко |
144.000000 |
Петро Петренко |
42.000000 |
Сидор Сидоренко |
141.000000 |
3 rows in set (0.11 sec)
Якщо необхідно з усіх результатів запиту, у якому задано умову групування, відібрати деякі, що задовольняють певну умову, то в інструкції на запит необхідно скористатися конструкцією HAVING, яка схожа на WHERE, але відрізняється від неї тим, що застосовується не для окремих записів, а для групп.
Наприклад, виберіть із бази даних записи про тих клієнтів, хто зробив замовлення, середня вартість яких меньше 60.00. Виконайте такий запит:
mysql> select customerlD, avg(Amount)
-> from orders
-> group by customerlD
-> having avg(Amount) < 60.00;
Результат запиту:
customerlD |
avg(Amount) |
|
|
1 |
144.000000 |
3 |
141.000000 |
2 rows in set (0.00 sec)
Підрахунок кількості записів: функція count
Підрахуйте кількість клієнтів у таблиці базі даних. Інструкція:
mysql> select count(*) from customers;
Результат запиту показує, що у базі даних книгарні зареєстровано 5 клієнтів:
Підрахуйте кількість замовлень зареєстрованих у базі даних. Вказівка: кількість замовлень дорівнює кількості записів у таблиці orders.
Для того, щоб з'ясувати відмінність між функціями COUNT(поле_даних) та COUNT(DISTINCT поле_даних) підрахуйте кількість записів у полі orderlD таблиці order__items двома різними способами:
1. Виконайте запит із застосуванням функції COUNT (поле_даних):
mysql> select count(orderlD) from order_items;
Pезультат запиту показує, що у полі orderlD записано 7 номерів замовлень:
2. Виконайте тепер інший запит із застосуванням функції COUNT (DISTINCT поле_даних) :
mysql> select count(DISTINCT orderlD) from оrder_items;
Результат цього запиту показує, що у полі orderlD записано всього 4 різних ( унікальних) номерів замовлень. Тобто є номери замовлень, які повторюються. Функція count (DISTINCT orderlD) не враховує значень, якщо вони повторюються:
count(DISTINCT orderlD) 4
1 row in set (0.11 sec)
Підрахуйте кількість книжок про MySQL зареєстрованих у базі даних. Інструкція на запит:
mysql> select count(title)
-> from books
-> where title like ("%MySQL%");
Результат запиту:
count(title)
2
1 row in set (0.06 sec)
Підрахуйте кількість різних книжок у замовленні 4. За прийнятою схемою, у таблиці order_items різні найменування замовлених книжок позначені їх номерами ISBN, які записані окремими рядками напроти номера відповідного замовлення. Тому для підрахунку кількості різних найменувань книжок у замовленні достатньо з усіх номерів замовлень вибрати потрібний номер та підрахувати кількість ISBN, які відповідають цьому номеру:
mysql> select count(ISBN)
-> from order_items
-> where orderlD = 4;
Результат запиту:
count(ISBN)
3
1 row in set (0.00 sec)
Підрахуйте, яка кількість різних найменувань книжок була замовлена у кожному зареєстрованому замовленні. Для підрахунку кількості різних найменувань книжок у кожному замовленні достатньо згрупувати номери замовлень і підрахувати кількість ISBN у кожній групі. Інструкція на запит:
mysql> select orderlD, count(ISBN)
-> from order_items
-> group by orderlD;
Результат запиту:
orderlD |
count (ISBN) |
1 |
1 |
2 |
2 |
3 |
1 |
4 |
3 |
4 row in set (0.06 sec)
Результат запиту:
Запит дає інформацію скільки різних книжок було у кожному замовленні. Але загальна кількість книжок у замовленні може бути більшою, тому що клієнти могли замовляти по декілька екземплярів кожного найменування.
Складіть список номерів замовлень, у яких було замовлено більше однієї книги.
Інструкція на запит:
mysql> select orderlD, count(ISBN)
-> from order_items
-> group by orderlD
-> having count(ISBN) > 1;
Peзультат запиту:
orderlD |
count (ISBN) |
2 |
2 |
4 |
3 |
2 rows in set (0.05 sec)
Зауваження. У запиті після інструкції SELECT можна вказати лише одне поле оrderlD, тоді у результаті запиту буде виведений лише список номерів замовлень (1-й стовпець), а дані про кількість замовлених книг (2-й стовпець) наведені не будуть.
Складіть список книжок з даними про те, у скількох замовленнях була замовлена кожна книжка.
Дані про назви книг містяться у таблиці books, а дані про замовлені екземпляри - у таблиці order_items, де кожен екземпляр у кожному замовленні записаний окремим рядком. Тому для одержання вказаного списку необхідно об'єднати ці дві таблиці, згрупувати книги за назвами або за ISBN та підрахувати кількість рядків у кожній групі. Інструкція на запит:
mysql> select books.title, count(order_items.order ID)
-> from books, order_items
-> where books.ISBN = order_items.ISBN
-> group by books.title;
Зауваження. Цей запит дає інформацію лише про те, у скількох замовленнях була замовлена кожна книжка. Але загальна кількість замовлених екземплярів кожної книги може бути більшою, тому що замовлення може містити декілька екземплярів кожної книги.
►► Підрахуйте, скільки разів (т.т. у скількох замовленнях) клієнти замовляли різні книги про MySQL. Для цього з результатів попереднього запиту необхідно вибрати лише ті книги, у назві яких міститься фрагмент "MySQL". Інструкція на запит:
mysql> select books, title, count (order_items.order ID)
-> from books, order_items
-> where books.ISBN = order_items.ISBN
-> and books.title like ("%MySQL%")
-> group by books.title;
Або
mysql> select books.title, count(order_іtems.orderID)
-> from books, order_items
-> where books.ISBN = order_items.ISBN
-> group by books.title
-> having books.title like ("%MySQL%");
Вказівка. Уважно розгляньте дві останні інструкції. З'ясуйте, в чому відмінність між ними, і чому вони дають однаковий результат.
Підрахуйте кількість різних найменувань книжок, які замовив кожен з клієнтів. Прізвища клієнтів зберігаються у таблиці customers, а найменування книг представлені їх унікальними номерами ISBN у таблиці order_items. Ці дві таблиці зв'язані через таблицю orders. Отже, запит має об'єднувати три таблиці - customers, orders та order_ items. Інструкція на запит:
mysql> select customers.name, count(DISTINCT order_items.ISBN)
-> from customers, orders, order_items
-> where customers.customerlD = orders.customer ID
-> and orders. orderlD = order_items.order ID
-> group by customers.name;
Pезультат запиту:
name |
count(DISTINCT order_items.ISBN) |
Иван Иваненко |
2 |
Петро Петренко |
1 |
Сидор Сидоренко |
3 |
rows in set (0.06 sec)
