- •1. Dмl: команди вибірки даних
- •2. Вибірка без використання фрази where
- •2.1. Проста вибірка
- •2.2. Виключення дублікатів
- •3. Вибірка з використанням фрази where
- •3.1. Використання операторів порівняння
- •3.2. Використання between
- •3.3. Використання in
- •3.4. Використання like
- •3.5. Залучення невизначеного значення (null-значення)
- •4. Вибірка з упорядкуванням
- •5. Запити з обчисленням. Обчислення у межах Select
- •6. Агрегування даних. Використання агрегатних функцій у запитах
- •6.1. Агрегатні sql-функції
- •6.2. Функції без використання фрази group by
- •6.3. Використання агрегатних функцій з угрупованнями. Фраза group by
- •6.4. Використання фрази having
- •7. Dмl: Запити з використанням кількох таблиць
- •7.1. Засоби одночасної роботи з множиною таблиць
- •7.2. Запити, що використовують з'єднання
6.3. Використання агрегатних функцій з угрупованнями. Фраза group by
Групування даних в операторі SELECT здійснюються за допомогою ключового слова GROUP BY і ключового слова HAVING, за допомогою якого задаються умови розбивки записів на групи.
GROUP BY нерозривно зв'язано з агрегатними функціями, без них воно практично не використовується. GROUP BY розділяє таблицю на групи, а агрегатна функція обчислює для кожної з них підсумкове значення. Ключове слово HAVING працює в такий спосіб: спочатку GROUP BY розбиває рядки на групи, потім на отримані набори накладаються умови HAVING.
Ми показали, як можна обчислити масу певного продукту, що поставляється постачальниками. Припустимо, що тепер потрібно обчислити загальну масу кожного з продуктів, що поставляються в даний час постачальниками. Це можна легко зробити за допомогою речення
SELECT ПР, SUM(Кількість)
FROM Постачання
GROUP BY ПР;
Фраза GROUP BY (групувати по) ініціює перекомпонування зазначеної в FROM таблиці по групах, кожна з який має однакові значення в стовпці, зазначеному в GROUP BY. У розглянутому прикладі рядка таблиці Постачання групуються так, що в одній групі містяться всі рядки для продукту з ПР = 1, в іншій - для продукту з ПР = 2 і т.д.. Далі до кожної групи застосовується фраза SELECT. Кожен вираз у цій фразі повинне приймати єдине значення для групи, тобто воно може бути або значенням стовпця, зазначеного в GROUP BY, або арифметичним виразом, що включає це значення, або константою, або одною з SQL-функцій, що оперує всіма значеннями стовпця в групі і зводить ці значення до єдиного значення (наприклад, до суми).
Фраза GROUP BY не припускає ORDER BY. Щоб гарантувати упорядкування по ПР результату розглянутого приклада, варто дати запит
SELECT ПР, SUM(Кількість) FROM Постачання GROUP BY ПР ORDER BY ПР;
Рядка таблиці можна групувати по будь-якій комбінації її стовпців. Так, по запиті
SELECT Т, БЛ, COUNT(БЛ)
FROM Замовлення
GROUP BY Т, БЛ;
можна довідатися коди (БЛ) і кількість порцій блюд COUNT(БЛ), замовлених відпочиваючими пансіонату (32 чоловік) на кожну з трапез (Т) наступного дня.
В списки полів оператора SELECT з розділом GROUP BY можна включати лише агрегатні функції та поля, якіе входять в умовуе групування. Наведений нижче запити видасть синтаксичну помилку:
SELECT
PD.PNUM,
PD.DNUM,
SUM(PD.VOLUME) AS SM
GROUP BY PD.DNUM;
Причина помилки у список полів включено поле PNUM, яке не входить в розділ GROUP BY.
Якщо у запиті використовуються фрази WHERE таи GROUP BY, то рядки, які не задовільняють фразі WHERE, вилучаються до групування.
6.4. Використання фрази having
Фраза HAVING грає таку ж роль для груп, що і фраза WHERE для рядків: вона використовується для виключення груп, точно так само, як WHERE використовується для виключення рядків. Ця фраза включається в речення лише при наявності фрази GROUP BY, а вираз у HAVING повинне приймати єдине значення для групи.
Синтаксис фрази HAVING має вигляд:
HAVING [NOT] HAVING_умова [[AND|OR][NOT] HAVING_умова]...
За допомогою фрази HAVING (синтаксис якої майже не відрізняється від синтаксису фрази WHERE) можна виключити з результату групи, не задовольняючим заданим умовам:
значення { = | <> | < | <= | > | >= } { значення | ( підзапит ) | SQL_функція }
{значення_1 | SQL_функція_1} [NOT] BETWEEN {значення_2 | SQL_функція_2} AND {значення_3 | SQL_функція_3}
{значення | SQL_функція} [NOT] IN { ( константа [,константа]... ) | ( підзапит ) }
{значення | SQL_функція} IS [NOT] NULL
[таблиця.]стовпець [NOT] LIKE 'рядок_символів' [ESCAPE 'символ']
EXISTS ( підзапит )
Приклад. Видати коди продуктів, що поставляються більш ніж двома постачальниками:
SELECT ПР
FROM Постачання
GROUP BY ПС
HAVING COUNT(*) > 2;
В одному запиті можуть зустрітися як умови добору рядків у розділі WHERE, так і умови добору груп у розділі HAVING. Умови добору груп не можна перенести з розділу HAVING у розділ WHERE. Аналогічно й умови добору рядків не можна перенести з розділу WHERE у розділ HAVING, за винятком умов, що включають поля зі списку угруповання GROUP BY.
