- •Державна податкова адміністрація україни
- •Поняття інформаційної системи
- •Життєвий цикл інформаційної системи
- •Історія розвитку субд
- •Реляційна модель даних
- •Математичні відношення
- •Реляційні ключі
- •Реляційна цілісність
- •Реляційна алгебра
- •Операції з’єднання
- •Нормалізовані відношення
- •Коли субд можна вважати реляційною
- •Основні типи даних визначених стандартом iso
- •Integer
- •Формати представлення дат
- •Формат time
- •Коротка характеристика сучасних субд
- •Основи мови sql
- •Insert into ustanova(kod,nazva) values(10234,’Академія дпс України’)
- •Прості запити
- •Умова відбору (ключове слово where)
- •Зрівняння
- •Використання діапазонів (between / not between)
- •Умови відбору з перевіркою входження у множину (in / not in)
- •Умови відбору з допомогою шаблону (like / not like)
- •Використання значення null в умовах відбору (is null / not null)
- •Використання множини таблиць в одному запиті
- •Імена таблиць і стовпчиків
- •З’єднання таблиць (join)
- •Ліве з’єднання (left join)
- •Сортування результату (фраза order by)
- •Групування результатів (фраза group by). Агрегатні функції
- •Використання фрази group by
- •Використання фрази having
- •Підзапити
- •Ключові слова any I all
- •Ключові слова exists I not exists
- •Комбінування результуючих таблиць (операції union, intersect і except)
- •Поновлення бази даних
- •Вставка нових даних
- •Модифікація даних (оператор update)
- •Використання inner join, left join в операторі update
- •Видалення даних з бази(оператор delete)
- •Визначення даних
- •Створення баз даних
- •Створення таблиць (оператор create table)
- •Видалення таблиць (оператор drop table)
- •Створення індексу (оператор create index)
- •Видалення індексу (оператор drop index)
- •Модифікація структури таблиці (оператор alter table)
- •Використання транзакцій
- •Управління доступом даних
- •Надання привілеїв іншим користувачам (оператор grant)
- •Відміна наданих привілеїв (оператор revoke)
Групування результатів (фраза group by). Агрегатні функції
Стандарт ISO містить визначення 5 агрегатних функцій:
COUNT |
Повертає кількість значень у вказаному стовпчику |
SUM |
Повертає суму значень у вказаному стовпчику |
AVG |
Повертає середнє значення у вказаному стовпчику |
MIN |
Повертає мінімальне значення у вказаному стовпчику |
MAX |
Повертає максимальне значення у вказаному стовпчику |
Всі ці функції оперують зі значеннями одного стовпчика і повертають єдине значення. Функції COUNT, MIN, MAX можуть застосовуватись як до числових стовпчиків, так і до нечислових, а функції SUM i AVG застосовують лише до числових стовпчиків. За виключенням COUNT(*), при обчисленні значення функцій значення NULL не враховуються. Варіант COUNT(*) є особливим випадком застосування функції COUNT. COUNT(*) повертає загальну кількість рядків результуючої таблиці, незалежно від того містяться там NULL-значення, дубльовані рядки або любі інші значення. Якщо до застосування агрегатних функцій необхідно виключити дубльовані значення, то потрібно перед іменем стовпчика, який є аргументом агрегатної функції помістити ключове слово DISTINCT, наприклад COUNT(DISTINCT kod). Слід зауважити, що не всі діалекти підтримують цю конструкцію. Скажімо Access не підтримує такого використання COUNT.
Стандарт ISO допускає використання ключового слова ALL (тобто всіх), що означає, що виключати дублі непотрібно. За змовчуванням, діє ALL.
Слід зауважити, що ключове слово DISTINCT в кожному запиті можна вказати не більше одного разу. Агрегатні функції можуть використовуватись тільки в списку фрази SELECT, або в складі HAVING. У всіх інших випадках використання агрегатних недопустимо. Якщо список у фразі SELECT є агрегатні функції і в тексті запиту відсутня фраза GROUP BY, тоді список у фразі SELECT не повинен містити назви стовпчиків. Наприклад, такий запит
SELECT kod, SUM(suma)
FROM table_a
є некоректним, оскільки назва стовпчика kod не повинна зустрічатись у списку фрази SELECT.
Приклади використання агрегатних функцій. Запит
SELECT COUNT(kod)
FROM table_a
Поверне число 6 – кількість рядків table_a. Запит
SELECT MAX(suma)
FROM table_a
поверне максимальне значення стовпчика suma – 150. Запит
SELECT MIN(suma) AS suma_min,AVG(suma) AS suma_avg
FROM table_a
поверне таку таблицю результату:
-
suma_min
suma_avg
28
77
де suma_min означає найменше значення стовпчика suma, а suma_avg середнє значення стовпчика suma таблиці table_a. Запит
SELECT MAX(suma),MIN(suma),AVG(suma)
FROM table_a
WHERE data<{d'2002-01-15'}
поверне, відповідно, максимальне, мінімальне і середнє значення стовпчика suma для покупок, які були здійснені до 15-01-2002 року. Це числа 150, 55 і 101,666666666667 відповідно.
Використання фрази group by
Наведені вище приклади підсумкових даних подібні підсумковим рядкам, які поміщаються в кінці звітів. Правда, досить часто у звітах вимагається формувати проміжні підсумки. Для цієї цілі в операторі SELECT вказується фраза GROUP BY. Стандарт ISO вимагає, щоб фрази SELECT і GROUP BY були тісно пов’язані між собою. При використанні в операторі SELECT фрази GROUP BY фраза SELECT повинна містити тільки такі типи елементів:
імена стовпчиків;
агрегатні функції;
константи;
вирази, що містять перечисленні вище елементи.
Всі імена стовпчиків, які перераховані в списку SELECT’у повинні бути присутніми і у фразі GROUP BY.
На конкретних прикладах пояснимо як потрібно користуватись групуванням. Нагадаємо, що в таблиці table_a міститься інформація про закупки товарів. Якщо уважно подивитись, в цій таблиці є по декілька рядків, у яких значення стовпчика kod (код товару) повторюється, наприклад 1 зустрічається 3 рази. Група рядків, у яких kod=1, матиме вид:
Kod |
suma |
data |
1 |
100 |
1.1.2002 |
1 |
55 |
10.1.2002 |
1 |
40 |
15.1.2002 |
Якщо потрібно дізнатись на яку суму закуплено кожного товару, необхідно сформувати такий запит:
SELECT kod,SUM(suma) AS suma_tov
FROM table_a
GROUP BY kod
Результуюча таблиця цього запиту матиме вид:
Kod |
Suma_tov |
1 |
195 |
2 |
239 |
3 |
28 |
Отже, оператор SELECT поступає таким чином, спочатку формує групи по значеннях стовпчиків, які перелічені у фразі GROUP BY (в нашому випадку одне поле kod), потім для кожної групи виконує агрегатну функцію і результат заносить у результуючу таблицю. Якби потрібно було крім сум вказати і кількість покупок кожного товару, запит був би таким:
SELECT kod,SUM(suma) AS suma_tov, COUNT(kod) AS kilkist_pokupok
FROM table_a
GROUP BY kod
Результуюча таблиця цього запиту матиме вид:
Kod |
Suma_tov |
kilkist_pokupok |
1 |
195 |
3 |
2 |
239 |
2 |
3 |
28 |
1 |
Якщо ж потрібно дізнатись на яку суму закуплено кожного товару до 20.1.2002року, необхідно сформувати такий запит:
SELECT kod,SUM(suma) AS suma_tov
FROM table_a
WHERE data<{d'2002-01-20'}
GROUP BY kod
Результуюча таблиця цього запиту матиме вид:
Kod |
Suma_tov |
1 |
195 |
2 |
150 |