Page 140 - 4636
P. 140
Розглянемо кілька прикладів, починаючи зі згаданого раніше. Середню суму замовлення
можна обчислити таким чином:
select avg (amount)
from orders;
Результат буде приблизно такий:
avg(amount)
54.985002'
Для отримання більш докладної інформації, можна скористатися конструкцією GROUP BY.
Це дозволить переглянути середню суму замовлення по групах, наприклад, за номером клієнта,
що дозволить з'ясувати, хто з клієнтів робить найбільші замовлення:
select customerid, avg(amount)from ordersgroup by customerid;
Вказівка конструкції GROUP BY у поєднанні з функцією агрегування змінює поведінку
функції. Замість того, щоб видавати середню суму всіх замовлень у таблиці, такий запит виведе
інформацію з середньої суми замовлень, зроблених кожним клієнтом (а якщо точніше, кожним
customerid):
customerid avg(amount)
3 49.990002
4 74.980003
5 47.485002
При використанні функцій угруповання і агрегування необхідно звернути увагу на такий
момент: якщо функція агрегування або конструкція GROUPBY використовується в ANSISQL, в
операторі SELECT можуть бути тільки функції агрегування і стовпці, зазначені в конструкції
GROUPBY. Крім того, якщо стовпець потрібно задіяти в конструкції GROUPBY, він повинен бути в
операторі SELECT.
Насправді MySQL забезпечує набагато більшу свободу дій, підтримує розширений
синтаксис, який дає можливість видаляти непотрібні елементи з оператора SELECT.
Крім угруповання і агрегування даних є можливість перевірити результат агрегування,
використовуючи конструкцію HAVING. Вона слідує відразу після конструкції GROUPBY і подібна
до конструкції WHERE, однак застосовується лише до груп.
Щоб розширити попередній приклад, скажімо, для отримання інформації про те, у кого з
клієнтів середня сума замовлення перевищує 50 доларів, можна скористатися наступним
запитом:
select customerid, avg(amount)
from orders
group by customerid
having avg(amount) > 50;
Зверніть увагу, що конструкція HAVING застосовується до груп. Такий запит призводить до
отримання такого результату:
avg(amount)
74.980003
137