Загалом кажучи, запити можуть здійснювати узагальнену групову обробку значень полів, що реалізується за допомогою агрегатних функцій. Агрегатні функції обчислюють одиночне значення для всієї групи таблиці. В SQL допускаються наступні агрегатні функції:
n COUNT - здійснює підрахунок кількості рядків або не-NULL значень полів, які вибрав запит;
n SUM - розраховує арифметичну суму всіх обраних значень даного поля;
n AVG - здійснює усереднення всіх обраних значень даного поля;
n МАХ - знаходить і повертає найбільше із всіх обраних значень даного поля;
n MIN - знаходить і повертає найменше із всіх обраних значень даного поля.
Агрегатні функції використовуються подібно іменам полів у конструкції SELECT запиту, але з врахуванням того, що вони беруть імена поля як аргументи. Варто мати на увазі, що з SUM й AVG працюють тільки числові поля, а з COUNT, МАХ, і MIN можуть працювати числові або символьні поля. Коли функції записуються із символьними полями МАХ й MIN посилаються на еквівалент ASCII, відповідно до якого вибирається максимальне або мінімальне значення.
Щоб знайти суму всієї виплаченої стипендії в таблиці з даними про студентів, можна використати наступний запит:
SELECT SUM (STIP)
FROM STUDENTS;
результат якого складається з однини 68.00.
Дія агрегатних функцій, як видно, відрізняється від вибору поля, при якому повертається, наприклад, одиночне значення. Із цієї причини агрегатні функції й поля не можуть спільно використатися без пропозиції GROUP BY, про яке мова йтиме нижче.
Функція COUNT трохи відрізняється від інших - як уже було замічено, вона підраховує кількість значень у даному стовпці, або число рядків у таблиці. Зокрема, для підрахунків кількості значень у стовпці, вона використається з DISTINCT . Наприклад, можна підрахувати кількість студентів, що здавали навчальні предмети по таблиці успішності за допомогою наступного запиту:
SELECT COUNT (DISTINCT SNUM)
FROM USP;
Як результат цих запитів буде отримане значення 4. Зверніть увагу на обов'язкові вимоги того, щоб DISTINCT був поміщений у круглі дужки на відміну від попередніх прикладів. Крім того, допускається можливості використання DISTINCT з будь-якими агрегатними функціями, але найбільше часто він використається з COUNT.
Для того щоб підрахувати загальне число рядків у таблиці, використають функцію COUNT із зірочкою замість імені поля, наприклад як у наступному прикладі:
SELECT COUNT (*)
FROM STUDENTS;
що як результат дасть значення 5.
COUNT із зірочкою включає запису з NULL значеннями, а також дублікати, із цієї причини DISTINCT у цьому випадку не може бути використаний.
Агрегатні функції в більшості реалізацій допускають використання аргументу ALL, що міститься перед ім'ям поля аналогічно DISTINCT, однак означає протилежну дію - включати дублікати. Необхідно пояснити розходження між ALL й * , коли вони використаються з COUNT - ALL використає ім'я поля як аргумент і не може підрахувати значення NULL. При цьому варто пам'ятати, що функції, відмінні від COUNT, ігнорують значення NULL у кожному разі. Наступний приклад підрахує кількість не-NULL значень у поле SNUM, включаючи повторення:
SELECT COUNT (ALL SNUM)
FROM USP;
Як результат цих запитів буде отримане значення 5.
В SQL допускається використання агрегатних функції з аргументами, які складаються з виразів, що включають одне або більше полів, при цьому команда DISTINCT не дозволяється. Припустимо, що необхідно знайти максимальну величину проіндексованої (у прикладі, збільшеної вдвічі) стипендії. Для кожного рядка таблиці такий запит повинен множити STIP на 2 і вибирати найбільше значення, що буде знайдено. Для цього можна скористатися наступним:
SELECT MAX (STIP*2)
FROM STUDENTS;
Як результат тут буде отримане число 51.00. Команда GROUP BY дозволяє визначати підмножину значень у поле в термінах іншого поля, і застосовувати функцію агрегату до такої підмножини. Це дає можливість поєднувати поля й агрегатні функції в єдиній конструкції SELECT. Наприклад, якщо виникає необхідність у визначенні найменшої оцінки, отриманої кожним студентом, то можна зробити з використанням GROUP BY наступний запит:
SELECT SNUM, MIN (OCENKA)
FROM USP
GROUP BY SNUM;
Результат виконання цього запиту показаний нижче:
SNUM
----------------
3412 4
3413 4
3414 3 3416 5
Команда GROUP BY може застосовуватися з агрегатними функціями незалежно від серій груп, які визначаються за допомогою значення поля в цілому. У цьому випадку кожна група складається із всіх рядків з тим же самим значенням поля SNUM, і MTN функція застосовується окремо для кожної такої групи. Значення поля, до якого застосовується GROUP BY, має тільки одне значення на групу виводу, так само як це робить агрегатна функція. Тому в результаті й з'являється сумісність, що дозволяє агрегатним функціям і полям об'єднатися.
У принципі, допускається використання GROUP BY одночасно з декількома полями. Для приклада модифікуємо попередній випадок таким чином, щоб виводилося найменше значення оцінки за кожний день. При цьому запит буде наступний:
SELECT SNUM, UDATE, MIN (OCENKA)
FROM USP
GROUP BY SNUM, UDATE;
Результат для цього запиту буде наступний:
SNUM UDATE
------------------------------------------
3412 10/06/1999 5
3412 12/06/1999 4
3413 10/06/1999 4
3414 11/06/1999 3 3416 12/06/1999 5
Тепер припустимо, що в попередньому прикладі, необхідно побачити тільки мінімальну оцінку, меншу 5. Прямо використати агрегатну функцію в команді WHERE у цьому випадку не можна, тому що предикати оцінюються в термінах одиночного рядка, а агрегатні функції - груп рядків. Тому необхідно скористатися командою HAVING, що визначає критерії, використовувані для видалення певних груп з висновку, на зразок того, як це робить команда WHERE для індивідуальних рядків. При цьому запит буде наступний:
SELECT SNUM, UDATE, MIN (OCENKA)
FROM USP
GROUP BY SNUM, UDATE
HAVING MIN (OCENKA)<5;
Результат цього запиту наведений нижче:
SNUM UDATE
------------------------------------------
3412 12/06/1999 4
3413 10/06/1999 4
3414 1/06/1999 3
Аргументи в команді HAVING підкоряються тим же самим правилам, що й у конструкції SELECT, що складається з команд, які використовують GROUP BY: вони повинні мати одне значення на групу виводу. Наприклад, наступна команда буде заборонена:
SELECT SNUM, MIN (OCENKA)
FROM USP
GROUP BY SNUM,
HAVING UDATE = 10/06/1999;
Поле UDATE не може бути викликано командою HAVING, тому що воно може мати більше чим одне значення на групу виводу, отже, для запобігання такої ситуації, команда HAVING повинна посилатися тільки на агрегатні функції й поля, обрані в GROUP BY. Правильний спосіб зробити розглянутий запит наступний:
SELECT SNUM, MIN (OCENKA)
FROM USP
WHERE UDATE = 10/06/1999
GROUP BY SNUM;
Результат такого запиту наступний:
SNUM
-------------
3412 5
3413 4
Оскільки поле UDATE відсутнє у виводі, то для підвищення наочності в результати варто включити текст, що пояснює, про те, що це за дані.
Як говорилося вище, HAVING може використати тільки аргументи, які мають одне значення на групу висновку. Практично ж посилання на поля, обрані за допомогою GROUP BY, також припустимі. Наприклад, для відбору найменших оцінок для студентів з номерами 3412 й 3413 можна скористатися наступним:
SELECT SNUM, MIN (OCENKA)
FROM USP
GROUP BY SNUM
HAVING SNUM IN (3412, 3413);
Результат цього запиту наступний:
SNUM
--------
3412 4
3413 4
Наостанок відмітимо, що варто бути уважним при використанні таких функцій: не можна використати агрегатну функцію від агрегатної функції.
Враховуючи вищесказане, з даного моменту можна використати запити для одержання певних значень і формувати вивід даних відповідно до вимог поточного завдання користувача.