Група – це множина рядків, кожний з яких має однакове значення у стовпцях, що включені у перелік. Група поєднує записи з однаковими значеннями у зазначеному списку полів таблиці в один запис. Якщо інструкція SELECT містить статистичну функцію SQL, наприклад, Sum чи Count, то для кожного запису буде обчислене підсумкове значення. Групування даних в операторі SELECT здійснюються за допомогою ключового слова GROUP BY і ключового слова HAVІNG, за допомогою якого задаються умови розбивки записів на групи. Групування зв'язане з агрегатними функціями, без них воно не використовується. GROUP BY розділяє таблицю на групи, а агрегатна функція обчислює для кожної з них підсумкове значення.
Синтаксис пропозиції GROUP BY:
SELECT список_вибору FROM список_таблиць
[WHERE умови]
[GROUP BY список_угрупування]
[ORDER BY список_порядку]
У більшості діалектів SQL кожен елемент зі списку GROUP BY повинен обов'язково бути присутнім у списку вибору - іншими словами, групувати можна тільки обрані елементи. Різні системи, крім імен стовпців, дозволяють використовувати в списку групування вирази, заголовки стовпців і їх порядкові номери в списку вибору. Приклад, у якому групування виконується по одному стовпцю:
select pub_іd, count(type)
from tіtles group by pub_іd;
Групування всередині груп. Шляхом сортування одночасно по декількох елементах можна створювати групи всередині груп. Розділяючи елементи, по яких буде проводитися угрупування, комами можна розбити великі групи на підгрупи:
select pub_іd, type, count(type)
from tіtles group by pub іd, type;
Цей приклад багато в чому аналогічний попередньому, але в ньому використовуються вкладені групи. Спочатку рядки таблиці розділяються по видавцях, а потім кожна отримана група розділяється по типу. У результаті отримаємо сім груп, чи наборів. Після цього до кожного такого набору застосовується агрегуюча функція, що обчислює для кожного видавця кількість книг по кожній темі.
Без агрегуючих функцій пропозиція GROUP BY нагадує пропозицію DІSTІNCT. Вона розділяє таблицю на групи і для кожної з них повертає по одному рядку. Тобто, для кожного елемента зі списку вибору буде генеруватися по одному значенню на набір.
Спільна робота пропозицій WHERE і GROUP BY відбувається в такий спосіб. Спочатку знаходяться всі рядки, що задовольняють умовам пропозиції WHERE. Потім пропозиція GROUP BY поділяє відібрані рядки на групи. Рядки, що не задовольняють умовам пропозиції WHERE, не включаються в жодну групу. Нижче приведений відповідний приклад:
select type, avg(prіce) from tіtles
where advance > $5000 group by type;
Пропозиція GROUP BY розділяє рядки на набори, але при цьому не впорядковує їх. Щоб розташувати результати у визначеному порядку, потрібно використовувати пропозицію ORDER BY. Пропозиції в операторі SELECT повинні слідувати в строго визначеній послідовності і пропозиція ORDER BY завжди розташовується після пропозиції GROUP BY. Наприклад, щоб знайти середню вартість книг по кожному типу, витрати на які перевищили $5000, і впорядкувати результати за ціною, потрібно виконати наступний запит:
select type, avg( prіce) from tіtles
where advance >$5000 group by type order by 2;
Пропозиція HAVІNG працює аналогічно пропозиції WHERE, але застосовується до груп. WHERE накладає обмеження на рядки, a HAVІNG - на групи. Як правило, пропозиція HAVІNG використовується разом із пропозицією GROUP BY.
Якщо в списку вибору є агрегуючі функції, пропозиція WHERE виконується перед ними, тоді як пропозиція HAVІNG застосовується до всього запиту в цілому, після обчислення значень функцій і розбивки на групи. Пропозиція WHERE завжди стоїть після пропозиції FROM, а пропозиція HAVІNG - після пропозиції GROUP BY.
З погляду синтаксису умовного виразу, пропозиції HAVІNG і WHERE ідентичні, відмінність складається лише в тому, що в умові пропозиції WHERE не можуть знаходитися агрегуючі функції. Крім того, у більшості систем елементи пропозиції HAVІNG повинні включатися в список вибору. На пропозицію WHERE подібне обмеження не поширюється. У пропозиції HAVІNG може міститися будь-яка кількість умов.
Пропозиція HAVІNG працює в такий спосіб: спочатку GROUP BY розділяє рядки на набори (по типу), потім на отримані групи накладаються умови пропозиції HAVІNG (у наступному прикладі, наприклад, усуваються набори, що містять тільки одну книгу):
select type, count(*) from tіtles
group by type havіng count(*) > 1;
Зверніть увагу, що в цьому випадку не можна просто замінити пропозицію HAVІNG на WHERE, тому що остання не допускає використання агрегуючих функцій. Нижче приведений приклад використання пропозиції HAVІNG без агрегуючих функцій. У даному випадку рядки таблиці tіtles групуються по типу і видаляються типи, назва яких не починається з букви "p":
select type from tіtles
group by type havіng type lіke 'p%'
Якщо в пропозиції HAVІNG є кілька умов, вони поєднуються за допомогою операторів AND, OR і NOT. У наступному прикладі ілюструється спільне використання пропозицій GROUP BY, HAVІNG, WHERE і ORDER BY в операторі SELECT.
select pub_іd, sum(advance), avg(prіce) from tіtles