Агрегатні функції SQL – SUM, MIN, MAX, AVG, COUNT. Обчислення в SQL Sum приклади

Головна / Налаштування

Вчимося підбивати підсумки. Ні, це ще результати вивчення SQL, а підсумки значень стовпців таблиць бази даних. Агрегатні функції SQL діють по відношенню до значень стовпця з метою отримання єдиного результуючого значення. Найчастіше застосовуються агрегатні функції SQL SUM, MIN, MAX, AVG та COUNT. Слід розрізняти два випадки застосування агрегатних функцій. Перший: агрегатні функції використовуються власними силами і повертають одне результуюче значення. Другий: агрегатні функції використовуються з оператором SQL GROUP BY, тобто з групуванням по полях (стовпчикам) для отримання результуючих значень у кожній групі. Розглянемо спочатку випадки використання агрегатних функцій без угруповання.

Функція SQL SUM

Функція SQL SUM повертає суму значень шпальти таблиці бази даних. Вона може застосовуватися тільки до стовпців, значення яких числа. Запити SQL для отримання результуючої суми починаються так:

SELECT SUM (ІМ'Я_СТОЛБЦЯ) ...

Після цього виразу слідує FROM (ІМ'Я_ТАБЛИЦІ), а далі за допомогою конструкції WHERE може бути задана умова. Крім того, перед іменем стовпця може бути вказано DISTINCT, і це означає, що враховуватимуться лише унікальні значення. За замовчуванням враховуються всі значення (для цього можна особливо вказати не DISTINCT, а ALL, але слово ALL не є обов'язковим).

Якщо ви хочете виконати запити до бази даних цього уроку на MS SQL Server, але ця СУБД не встановлена ​​на вашому комп'ютері, то її можна встановити, користуючись інструкцією з цього посилання .

Спочатку працюватимемо з базою даних фірми - Company1. Скрипт для створення цієї бази даних, її таблиць та запалення таблиць даними – у файлі за цим посиланням .

приклад 1.Є база даних фірми з даними про її підрозділи та співробітників. Таблиця Staff також має стовпець з даними про заробітну плату співробітників. Вибірка з таблиці має такий вигляд (для збільшення картинки клацнути по ній лівою кнопкою миші):

Для отримання суми розмірів усіх заробітних плат використовуємо наступний запит (на MS SQL Server - із попередньою конструкцією USE company1;):

SELECT SUM (Salary) FROM Staff

Цей запит поверне значення 287664,63.

А тепер . У вправах вже починаємо ускладнювати завдання, наближаючи їх до тих, що зустрічаються практично.

Функція SQL MIN

Функція SQL MIN також діє щодо стовпців, значеннями яких є числа та повертає мінімальне серед усіх значень стовпця. Ця функція має синтаксис, аналогічний синтаксису функції SUM.

Приклад 3.База даних та таблиця - ті ж, що й у прикладі 1.

Потрібно дізнатися про мінімальну заробітну плату співробітників відділу з номером 42. Для цього пишемо наступний запит (на MS SQL Server - з попередньою конструкцією USE company1;):

Запит поверне значення 10 505,90.

І знову вправу для самостійного вирішення. У цьому та деяких інших вправах потрібно вже не лише таблиця Staff, а й таблиця Org, що містить дані про підрозділи фірми:


Приклад 4.До таблиці Staff додається таблиця Org, що містить дані підрозділах фірми. Вивести мінімальну кількість років, опрацьованих одним співробітником у відділі, розташованому у Бостоні.

Функція SQL MAX

Аналогічно працює та має аналогічний синтаксис функція SQL MAX, яка застосовується, коли потрібно визначити максимальне значення серед усіх значень стовпця.

Приклад 5.

Потрібно дізнатися максимальну заробітну плату співробітників відділу з номером 42. Для цього пишемо наступний запит (на MS SQL Server – з попередньою конструкцією USE company1;):

Запит поверне значення 18352,80

Прийшов час вправи для самостійного вирішення.

Приклад 6.Знову працюємо з двома таблицями – Staff та Org. Вивести назву відділу та максимальне значення комісійних, які отримують один співробітник у відділі, що належить до групи відділів (Division) Eastern. Використати JOIN (з'єднання таблиць) .

Функція SQL AVG

Зазначене щодо синтаксису для попередніх описаних функцій є правильним і щодо функції SQL AVG. Ця функція повертає середнє значення серед усіх значень шпальти.

Приклад 7.База даних та таблиця - ті ж, що й у попередніх прикладах.

Нехай потрібно дізнатися про середній трудовий стаж співробітників відділу з номером 42. Для цього пишемо наступний запит (на MS SQL Server - з попередньою конструкцією USE company1;):

Результатом буде значення 6,33

Приклад 8.Працюємо з однією таблицею – Staff. Вивести середню зарплату працівників зі стажем від 4 до 6 років.

Функція SQL COUNT

Функція SQL COUNT повертає кількість записів таблиці бази даних. Якщо в запиті вказати SELECT COUNT(ІМ'Я_СТОЛБЦЯ) ..., результатом буде кількість записів без урахування тих записів, у яких значенням стовпця є NULL (невизначене). Якщо використовувати як аргумент зірочку і почати запит SELECT COUNT(*) ..., то результатом буде кількість всіх записів (рядків) таблиці.

Приклад 9.База даних та таблиця - ті ж, що й у попередніх прикладах.

Потрібно дізнатися про кількість всіх співробітників, які отримують комісійні. Число співробітників, у яких значення стовпця Comm – не NULL, поверне наступний запит (на MS SQL Server – з попередньою конструкцією USE company1;):

SELECT COUNT (Comm) FROM Staff

Результатом буде значення 11.

Приклад 10База даних та таблиця - ті ж, що й у попередніх прикладах.

Якщо потрібно дізнатися загальну кількість записів у таблиці, то застосовуємо запит із зірочкою як аргумент функції COUNT (на MS SQL Server - з попередньою конструкцією USE company1;):

SELECT COUNT (*) FROM Staff

Результатом буде значення 17.

В наступному вправі для самостійного вирішенняпотрібно використовувати підзапит.

Приклад 11.Працюємо з однією таблицею – Staff. Вивести кількість працівників у відділі планування (Plains).

Агрегатні функції разом із SQL GROUP BY (угрупуванням)

Тепер розглянемо застосування агрегатних функцій разом із оператором SQL GROUP BY. Оператор SQL GROUP BY служить для групування результуючих значень стовпчиків таблиці бази даних. На сайті є урок, присвячений окремо цьому оператору .

Працюватимемо з базою даних "Портал оголошень 1". Скрипт для створення цієї бази даних, її таблиці та запалення таблиці даних – у файлі за цим посиланням .

Приклад 12Отже є база даних порталу оголошень. Вона містить таблицю Ads, яка містить дані про оголошення, подані за тиждень. Стовпець Category містить дані про великі категорії оголошень (наприклад, Нерухомість), а стовпець Parts - про дрібніші частини, що входять до категорії (наприклад, частини Квартири та Дачі є частинами категорії Нерухомість). Стовпець Units містить дані про кількість поданих оголошень, а стовпець Money - про грошові суми, отримані за подачу оголошень.

CategoryPartUnitsMoney
ТранспортАвтомашини110 17600
НерухомістьКвартири89 18690
НерухомістьДачі57 11970
ТранспортМотоцикли131 20960
БудматеріалиДошки68 7140
ЕлектротехнікаТелевізори127 8255
ЕлектротехнікаХолодильники137 8905
БудматеріалиРегіпс112 11760
ДозвілляКнижки96 6240
НерухомістьБудинки47 9870
ДозвілляМузика117 7605
ДозвілляІгри41 2665

Використовуючи оператор SQL GROUP BY, знайти суми грошей, отриманих за подачу оголошень в кожній категорії. Пишемо наступний запит (на MS SQL Server - із попередньою конструкцією USE adportal1;):

SELECT Category, SUM (Money) AS Money FROM ADS GROUP BY Category

Приклад 13База даних та таблиця - та сама, що у попередньому прикладі.

Використовуючи оператор SQL GROUP BY, з'ясувати, в якій частині кожної категорії було подано найбільшу кількість оголошень. Пишемо наступний запит (на MS SQL Server - із попередньою конструкцією USE adportal1;):

SELECT Category, Part, MAX (Units) AS Maximum FROM ADS GROUP BY Category

Результатом буде наступна таблиця:

Підсумкові та індивідуальні значення в одній таблиці можна отримати об'єднанням результатів запитів за допомогою оператора UNION .

Реляційні бази даних та мова SQL

Описується використання арифметичних операторів і побудова обчислюваних стовпців. Розглядаються підсумкові (агрегатні) функції COUNT, SUM, AVG, MAX, MIN. Надається приклад використання оператора GROUP BY для групування у запитах вибірки даних. Описується застосування пропозиції HAVING.

Побудова обчислюваних полів

У загальному випадку для створення обчислюваного (похідного) поляу списку SELECT слід вказати деякий вираз мови SQL. У цих висловлюваннях застосовуються арифметичні операції додавання, віднімання, множення та поділу, а також вбудовані функції мови SQL. Можна вказати ім'я будь-якого стовпця (поля) таблиці чи запиту, але використовувати ім'я стовпця лише тієї таблиці чи запиту, які вказані у списку пропозиції FROM відповідної інструкції. При побудові складних виразів можуть знадобитися дужки.

Стандарти SQL дозволяють явно задавати імена стовпців результуючої таблиці, навіщо застосовується фраза AS .

SELECT Товар.Назва, Товар.Ціна, Угода.Кількість, Товар.Ціна*Угода.Кількість AS Вартість FROM Товар INNER JOIN Угода ON Товар. Приклад 6.1. Розрахунок загальної вартості кожної угоди.

Приклад 6.2.Отримати список фірм із зазначенням прізвища та ініціалів клієнтів.

SELECT Фірма, Прізвище+""+ Left(Ім'я,1)+"."+Left(По батькові,1)+"."AS ПІБ FROM Клієнт Приклад 6.2. Отримання списку фірм із зазначенням прізвища та ініціалів клієнтів.

У запиті використана вбудована функція Left, що дозволяє вирізати в текстовій змінній один символ зліва в даному випадку.

Приклад 6.3.Отримати список товарів із зазначенням року та місяця продажу.

SELECT Товар.Назва, Year(Угода.Дата) AS Год, Month(Угода.Дата) AS Місяць FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара Приклад 6.3. Отримання списку товарів із зазначенням року та місяця продажу.

У запиті використані вбудовані функції Year та Month для виділення року та місяця з дати.

Використання підсумкових функцій

За допомогою підсумкових (агрегатних) функційв рамках SQL-запиту можна отримати ряд узагальнюючих статистичних відомостей про множину відібраних значень вихідного набору.

Користувачеві доступні такі основні підсумкові функції:

  • Count (Вираз) - визначає кількість записів у вихідному наборі SQL-запиту;
  • Min/Max (Вираз) - визначають найменше та найбільше з безлічі значень у деякому полі запиту;
  • Avg (вираз) - ця функція дозволяє розрахувати середнє значення безлічі значень, що зберігаються в певному полі відібраних запитом записів. Воно є середнім арифметичним значенням, тобто. сумою значень, поділеної їх кількість.
  • Sum (Вираз) - обчислює суму безлічі значень, які у певному полі відібраних запитом записів.

Найчастіше як вираз виступають імена стовпців. Вираз може обчислюватися і за значеннями кількох таблиць.

Всі ці функції оперують зі значеннями в єдиному стовпці таблиці або з арифметичним виразом і повертають єдине значення. Функції COUNT , MIN та MAX застосовні як до числових, так і до нечислових полів, тоді як функції SUM та AVG можуть використовуватись лише у разі числових полів, за винятком COUNT(*) . При обчисленні результатів будь-яких функцій спочатку виключаються всі порожні значення, після чого потрібна операція застосовується тільки до конкретних значень стовпця, що залишилися. Варіант COUNT(*) - особливий випадок використання функції COUNT , його призначення полягає у підрахунку всіх рядків у результуючій таблиці, незалежно від цього, містяться там порожні, дублюючі чи будь-які інші значення.

Якщо перед застосуванням узагальнюючої функції необхідно виключити дублюючі значення, слід перед ім'ям стовпця у визначенні функції помістити ключове слово DISTINCT . Воно не має сенсу для функцій MIN і MAX, проте його використання може вплинути на результати виконання функцій SUM і AVG, тому необхідно заздалегідь обміркувати, чи воно має бути присутнім у кожному конкретному випадку. Крім того, ключове слово DISTINCT може бути вказано у будь-якому запиті не більше одного разу.

Дуже важливо відзначити, що підсумкові функціїможуть використовуватися лише у списку пропозиції SELECT та у складі пропозиції HAVING. В інших випадках це неприпустимо. Якщо список у пропозиції SELECT містить підсумкові функції, а тексті запиту відсутня фраза GROUP BY , що забезпечує об'єднання даних групи, то жоден із елементів списку пропозиції SELECT неспроможна включати будь-яких посилань на поля, крім ситуації, коли поля виступають як аргументів підсумкових функцій.

Приклад 6.4.Визначити першу за алфавітом назву товару.

SELECT Min(Товарна назва) AS Min_Назва FROM Товар Приклад 6.4. Визначення першої за алфавітом назви товару.

Приклад 6.5.Визначити кількість угод.

SELECT Count(*) AS Кількість угод FROM Угода Приклад 6.5. Визначити кількість угод.

Приклад 6.6.Визначити сумарну кількість проданого товару.

SELECT Sum(Угода.Кількість) AS Кількість_товару FROM Угода Приклад 6.6. Визначення сумарної кількості проданого товару.

Приклад 6.7.Визначити середню ціну проданого товару.

SELECT Avg(Товар.Ціна) AS Avg_Ціна FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара; Приклад 6.7. Визначення середньої ціни проданого товару.

SELECT Sum(Товар.Ціна*Угода.Кількість) AS Вартість FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара Приклад 6.8. Підрахунок вартості проданих товарів.

Пропозиція GROUP BY

Часто у запитах потрібно формувати проміжні підсумки, що зазвичай відображається появою запиту фрази " кожного ... " . Для цього в операторі SELECT використовується пропозиція GROUP BY . Запит, у якому є GROUP BY , називається групуючим запитом, оскільки у ньому групуються дані, отримані в результаті виконання операції SELECT , після чого кожної окремої групи створюється єдина сумарна рядок. Стандарт SQL вимагає, щоб пропозиція SELECT та фраза GROUP BY були тісно пов'язані між собою. За наявності в операторі SELECT фрази GROUP BY кожен елемент списку у реченні SELECT повинен мати єдине значення для всієї групи. Більш того, пропозиція SELECT може включати лише такі типи елементів: імена полів, підсумкові функції, константи та вирази, що включають комбінації перерахованих вище елементів

Всі імена полів, наведені в списку пропозиції SELECT, повинні бути присутніми і у фразі GROUP BY - за винятком випадків, коли ім'я стовпця використовується в підсумкової функції. Зворотне правило не є справедливим – у фразі GROUP BY можуть бути імена стовпців, які відсутні у списку пропозиції SELECT.

Якщо спільно з GROUP BY використовується пропозиція WHERE , воно обробляється першим, а групуванню піддаються ті рядки, які задовольняють умові пошуку.

Стандартом SQL визначено, що з проведенні групування всі відсутні значення розглядаються як рівні. Якщо два рядки таблиці в тому самому групованому стовпці містять значення NULL і ідентичні значення у всіх інших непустих групованих стовпцях, вони поміщаються в одну і ту ж групу.

Приклад 6.9.Обчислити середній обсяг покупок, здійснених кожним покупцем.

SELECT Клієнт.Прізвище, Avg(Угода.Кількість) AS Середня_кількість FROM Клієнт INNER JOIN Угода ON Клієнт.КодКлієнта=Угода.КодКлієнта GROUP BY Клієнт.Прізвище Приклад 6.9. Обчислення середнього обсягу покупок, здійснених кожним покупцем.

Фраза "кожним покупцем" знайшла своє відображення у SQL-запиті у вигляді пропозиції GROUP BY Клієнт.Прізвище.

Приклад 6.10.Визначити, яку суму було продано товар кожного найменування.

SELECT Товар.Назва, Sum(Товар.Ціна*Угода.Кількість) AS Вартість FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара GROUP BY Товар.Назва Приклад 6.10. Визначення, яку суму було продано товар кожного найменування.

SELECT Клієнт.Фірма, Count(Угода.КодУгоди) AS Кількість_угод FROM Клієнт INNER JOIN Угода ON Клієнт.КодКлієнта=Угода.КодКлієнта GROUP BY Клієнт.Фірма Приклад 6.11. Підрахунок кількості угод, здійснених кожною фірмою.

SELECT Клієнт.Фірма, Sum(Угода.Кількість) AS Загальна_Кількість, Sum(Товар.Ціна*Угода.Кількість) AS Вартість FROM Товар INNER JOIN (Клієнт INNER JOIN Угода ON Клієнт.КодКлієнта=Угода.КодКлієнта) .КодТовара GROUP BY Клієнт.Фірма Приклад 6.12. Підрахунок загальної кількості купленого кожної фірми товару та її вартості.

Приклад 6.13.Визначити сумарну вартість кожного товару за місяць.

SELECT Товар.Назва, Month(Угода.Дата) AS Місяць, Sum(Товар.Ціна*Угода.Кількість) AS Вартість FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара GROUP BY Товар.Назва, Month(Угода.Дата) ) Приклад 6.13. Визначення сумарної вартості кожного товару кожен місяць.

Приклад 6.14.Визначити сумарну вартість кожного товару першого ґатунку за кожен місяць.

SELECT Товар.Назва, Month(Угода.Дата) AS Місяць, Sum(Товар.Ціна*Угода. Кількість) AS Вартість FROM Товар INNER JOIN Угода ON Товар. . Назва, Month (Угода. Дата) Приклад 6.14. Визначення сумарної вартості кожного товару першого ґатунку за кожен місяць.

Пропозиція HAVING

За допомогою HAVING відображаються всі попередньо згруповані за допомогою GROUP BY блоки даних, що задовольняють заданим HAVING умовам. Це додаткова можливість "профільтрувати" вихідний набір.

Умови HAVING відрізняються від умов WHERE :

  • HAVING виключає із результуючого набору даних групи з результатами агрегованих значень;
  • WHERE виключає з розрахунку агрегатних значень з угруповання запису, що не задовольняють умові;
  • за умови пошуку WHERE не можна задавати агрегатні функції.

Приклад 6.15.Визначити фірми, у яких загальна кількість угод перевищила три.

SELECT Клієнт.Фірма, Count(Угода.Кількість) AS Кількість_угод FROM Клієнт INNER JOIN Угода ON Клієнт.КодКлієнта=Угода.КодКлієнта GROUP BY Клієнт.Фірма HAVING Count(Угода.Кількість)>3 Приклад 6.15. Визначення фірм, які мають загальну кількість угод перевищило три.

Приклад 6.16.Вивести список товарів, проданих у сумі понад 10000 крб.

SELECT Товар.Назва, Sum(Товар.Ціна*Угода.Кількість) AS Вартість FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара GROUP BY Товар.Назва HAVING Sum(Товар.Ціна*Угода.Кількість)>1000 Приклад 6.16. Висновок переліку товарів, проданих у сумі понад 10000 крб.

Приклад 6.17.Вивести список товарів, проданих у розмірі понад 10000 без зазначення суми.

SELECT Товар.Назва FROM Товар INNER JOIN Угода ON Товар.КодТовара=Угода.КодТовара GROUP BY Товар.Назва HAVING Sum(Товар.Ціна*Угода.Кількість)>10000 Приклад 6.17. Виведення списку товарів, проданих у сумі понад 10000 без зазначення суми.

У цьому навчальному посібнику ви дізнаєтесь, як використовувати функцію SUMв SQL Server (Transact-SQL) із синтаксисом та прикладами.

Опис

В SQL Server (Transact-SQL) функція SUMповертає сумарне значення виразу.

Синтаксис

Синтаксис функції SUM у SQL Server (Transact-SQL):

АБО синтаксис функції SUM при групуванні результатів за одним або декількома стовпцями:

Параметри чи аргументи

expression1 , expression2 , … expression_n — вирази, які не включені до функції SUM і повинні бути включені до оператора GROUP BY в кінці SQL-пропозиції.
aggregate_expression — це стовпець або вираз, який буде підсумовувати.
tables — таблиці, з яких потрібно отримати записи. Повинна бути хоч одна таблиця, перерахована в операторі FROM.
WHERE conditions – необов'язковий. Це умови, які слід виконувати для вибраних записів.

Застосування

Функція SUM може використовуватися в наступних версіях SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005

Приклад із одним полем

Розглянемо деякі приклади SQL Server функції SUM, щоб зрозуміти, як використовувати функцію SUM у SQL Server (Transact-SQL).

Наприклад, ви можете дізнатися, як загальна кількість всіх продуктів, кількість яких більше 10.

У цьому прикладі функції SUM ми виразом SUM (quantity) встановили псевдонім «Total Quantity». При поверненні результуючого набору – «Total Quantity» відображатиметься як ім'я поля.

Приклад використання DISTINCT

Ви можете використовувати оператор DISTINCT у функції SUM. Наприклад, наведений нижче оператор SQL повертає загальну суму salary з унікальними значеннями salary, де salary нижче 29 000 доларів на рік.

Якби дві salary становили 24 000 дол. на рік, функції SUM використовували тільки одне з цих значень.

Приклад використання формули

Вираз, що міститься у функції SUM, не обов'язково має бути одним полем. Ви також можете використати формулу. Наприклад, ви можете розрахувати спільну комісію.

Transact-SQL

SELECT SUM(sales * 0.03) AS "Total Commission" FROM orders;

SELECT SUM (sales * 0.03) AS "Total Commission"

FROM orders;

Приклад використання GROUP BY

У деяких випадках потрібно використовувати оператор GROUP BY з функцією SUM.

Функція SUM в SQL-мові, незважаючи на свою простоту, використовується досить часто під час роботи з базою даних. З її допомогою зручно отримувати деякі проміжні або підсумкові результати, не вдаючись по допомогу допоміжних інструментаріїв СУБД.

Синтаксис функції

У більшості мов SQL синтаксис sum однаковий - як аргумент використовується тільки ім'я поля або деяка арифметична дія кількох з них, за якою потрібно провести підсумовування.

У виняткових випадках можна передавати конкретне значення у вигляді числа чи змінної, проте подібні "схеми" практично не використовуються, тому що не несуть у собі великої цінності. Нижче наведено синтаксис функції на мові SQL:

sum(а) - тут як параметр а використовується деяке числове значення або вираз

Варто зазначити, що перед параметром можна встановлювати ключові слова, наприклад DISTINCT або ALL, які будуть брати тільки унікальні або всі значення відповідно.

Приклад використання SUM у SQL

Для остаточного розуміння принципу роботи функції слід розглянути кілька прикладів. SQL SUM може використовуватися як як повертається результату, так і в ролі проміжного значення, наприклад, для перевірки умови.

Для першого випадку розглянемо варіант, коли потрібно повернути суму продажів по кожному товару, враховуючи, що кількість зроблених покупок може бути у множині. Для отримання результату достатньо виконати наступний запит:

SELECT Товар, sum(СумаПокупок) FROM Продаж GroupBy Товар;

Відповіддю на цю команду буде унікальний список товарів з сумою покупок по кожному з них.

Для другого прикладу необхідно отримати список товарів, сума продажів за якими перевищила деяке значення, наприклад, 100. Отримати результат за даним завданням можна декількома способами, найбільш оптимальним з яких є виконання одного запиту:

SELECT Товар FROM (SELECT Товар, sum(СумаПокупок) as Сума FROM Продажу) WHERE Сума > 100.

Як дізнатися кількість моделей ПК, що випускаються тим чи іншим постачальником? Як визначити середнє значення ціни на комп'ютери, які мають однакові технічні характеристики? На ці та інші питання, пов'язані з деякою статистичною інформацією, можна отримати відповіді за допомогою підсумкових (агрегатних) функцій. Стандартом передбачені такі агрегатні функції:

Усі ці функції повертають єдине значення. При цьому функції COUNT, MINі MAXзастосовні до будь-яких типів даних, у той час як SUMі AVGвикористовуються лише для числових полів. Різниця між функцією COUNT(*)і COUNT(<имя поля>) полягає в тому, що друга за підрахунком не враховує NULL-значення.

приклад. Знайти мінімальну та максимальну ціну на персональні комп'ютери:

приклад. Знайти наявну кількість комп'ютерів, випущених виробником А:

приклад. Якщо ж нас цікавить кількість різних моделей, що випускаються виробником А, запит можна сформулювати наступним чином (користуючись тим фактом, що в таблиці Product кожна модель записується один раз):

приклад. Знайти кількість наявних різних моделей, що випускаються виробником А. Запит схожий на попередній, в якому потрібно визначити загальну кількість моделей, що випускаються виробником А. Тут же потрібно знайти число різних моделей в таблиці PC (тобто наявних у продажу).

Для того, щоб при отриманні статистичних показників використовувалися тільки унікальні значення, аргументі агрегатних функційможна використовувати параметр DISTINCT. Інший параметр ALLвикористовується за умовчанням і передбачає підрахунок всіх значень, що повертаються в стовпці. Оператор,

Якщо нам потрібно отримати кількість моделей ПК, вироблених кожнимвиробником, то потрібно використовувати пропозиція GROUP BY, синтаксично наступного після пропозиції WHERE.

Пропозиція GROUP BY

Пропозиція GROUP BYвикористовується визначення груп вихідних рядків, яких можуть застосовуватися агрегатні функції (COUNT, MIN, MAX, AVG та SUM). Якщо ця пропозиція відсутня, і використовуються агрегатні функції, всі стовпці з іменами, згаданими в SELECT, повинні бути включені в агрегатні функції, і ці функції будуть застосовуватися до всього набору рядків, які відповідають предикату запиту. В іншому випадку всі стовпці списку SELECT, не ввійшлив агрегатні функції повинні бути вказані у пропозиції GROUP BY. Внаслідок чого всі вихідні рядки запиту розбиваються на групи, що характеризуються однаковими комбінаціями значень у цих стовпцях. Після цього до кожної групи буде застосовано агрегатні функції. Слід пам'ятати, що з GROUP BY всі значення NULL трактуються як рівні, тобто. при групуванні поля, що містить NULL-значення, всі такі рядки попадуть в одну групу.
Якщо за наявності пропозиції GROUP BY, у реченні SELECT відсутні агрегатні функції, То запит просто поверне по одному рядку з кожної групи. Цю можливість, поряд із ключовим словом DISTINCT, можна використовувати для виключення дублікатів рядків у результуючому наборі.
Розглянемо простий приклад:
SELECT model, COUNT(model) AS Qty_model, AVG(price) AS Avg_price
FROM PC
GROUP BY model;

У цьому запиті кожної моделі ПК визначається їх кількість і середня вартість. Усі рядки з однаковими значеннями model (номер моделі) утворюють групу, і на виході SELECT обчислюються кількість значень та середні значення ціни для кожної групи. Результатом виконання запиту буде наступна таблиця:
model Qty_model Avg_price
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Якби у SELECT був присутній стовпець з датою, можна було б обчислювати ці показники кожної конкретної дати. Для цього потрібно додати дату як групуючий стовпчик, і тоді агрегатні функції обчислювалися б для кожної комбінації значень (модель-дата).

Існує кілька певних правил виконання агрегатних функцій:

  • Якщо в результаті виконання запиту не отримано жодного рядка(або одного рядка для цієї групи), то вихідні дані для обчислення будь-якої з агрегатних функцій відсутні. У цьому випадку результат виконання функцій COUNT буде нуль, а результатом всіх інших функцій - NULL.
  • Аргументагрегатної функції не може сам утримувати агрегатні функції(функція від функції). Тобто. в одному запиті не можна, скажімо, одержати максимум середніх значень.
  • Результат виконання функції COUNT є ціле число(INTEGER) Інші агрегатні функції успадковують типи даних значень, що обробляються.
  • Якщо при виконанні функції SUM був отриманий результат, що перевищує максимальне значення типу даних, що використовується, виникає помилка.

Отже, якщо запит не містить пропозиції GROUP BY, то агрегатні функції, включені в пропозиція SELECT, виконуються над усіма результуючими рядками запиту. Якщо запит містить пропозиція GROUP BY, кожен набір рядків, який має однакові значення стовпця або групи стовпців, заданих у пропозиції GROUP BY, становить групу, та агрегатні функціївиконуються кожної групи окремо.

Пропозиція HAVING

Якщо пропозиція WHEREвизначає предикат для фільтрації рядків, то пропозиція HAVINGзастосовується після угрупованнядля визначення аналогічного предикату, що фільтрує групи за значеннями агрегатних функцій. Ця пропозиція потрібна для перевірки значень, які отримані за допомогою агрегатної функціїне з окремих рядків джерела записів, визначеного в реченні FROM, а з груп таких рядків. Тому така перевірка не може утримуватися в реченні WHERE.

© 2022 androidas.ru - Все про Android