MySQL Агрегатні функції: SUM, COUNT, AVG & МАКС

⚡ Розумний підсумок

Агрегатні функції в MySQL виконувати обчислення в багатьох рядках одного стовпця та повертати одне підсумоване значення. П'ять стандартних функцій ISO — COUNT, SUM, AVG, MIN та MAX — лежать в основі майже кожного звіту, який створює база даних.

  • 🔢 Поведінка COUNT: Функція COUNT(column) ігнорує значення NULL, тоді як функція COUNT(*) підраховує кожен рядок у таблиці, включаючи дублікати та значення NULL.
  • 🚫 Ключове слово DISTINCT: DISTINCT видаляє дублікати значень перед виконанням обчислення; ALL використовується за замовчуванням і зберігає їх.
  • 📉 МІН та МАКС: Функція MIN повертає найменше значення у стовпці, а MAX — найбільше, як для числових, так і для рядкових типів, а також для типів дати.
  • СУМ і AVG: Обидва працюють лише з числовими стовпцями та обидва виключають NULL-рядки з повернутого результату.
  • 📊 ГРУПОВАТИ ЗА СПАРЮВАННЯМ: Додавання GROUP BY перетворює один підсумковий показник на один підсумковий рядок для кожної групи.
  • ⚠️ НУЛЬОВА пастка: AVG ділить лише на кількість рядків, що не є NULL, тому пропущені значення непомітно підвищують середнє значення.

Що таке агрегатні функції в MySQL?

An агрегатна функція зчитує багато рядків одного стовпця та згортає їх в одне значення. Агрегатні функції полягають у:

  • Виконання обчислень у кількох рядках
  • З одного стовпця таблиці
  • І повертає одне значення.

Стандарт ISO визначає п'ять (5) агрегатних функцій, а саме:

  1. COUNT
  2. SUM
  3. AVG
  4. MIN
  5. MAX

Одне правило застосовується до всіх п'яти: Агрегатні функції ігнорують значення NULLCOUNT(*) — це єдиний виняток, і нижче ми розглянемо, чому.

Навіщо використовувати агрегатні функції

Різні рівні організації мають різні вимоги до інформації. Керівників вищої ланки зазвичай цікавлять цілі цифри, а не окремі деталі.

Агреговані функції дозволяють нам легко створювати зведені дані з нашої бази даних.

Наприклад, з нашої бази даних myflix керівництву можуть знадобитися такі звіти:

  • Найменше взяті напрокат фільми.
  • Більшість прокатних фільмів.
  • Середня кількість разів, коли кожен фільм береться в прокат протягом місяця.

Усі вищезгадані звіти отримані з агрегатних функцій. Давайте розглянемо кожну з них детальніше.

функція COUNT

Функція COUNT повертає загальну кількість значень у вказаному полі як для числових, так і для нечислових типів даних. Як і кожна агрегатна функція, COUNT(column) виключає значення NULL.

COUNT(*) – це спеціальна форма, яка повертає кількість усіх рядків у таблиці. Вона також підраховує NULLs і дублікати, оскільки він підраховує рядки, а не значення.

Таблиця movierentals містить такі дані:

номер для посилань дата транзакції дата_повернення членський_ номер movie_id movie_ повернувся
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

Припустимо, що нам потрібно отримати кількість разів, коли фільм з ідентифікатором 2 був взятий в прокат.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Виконання цього в MySQL Верстак проти myflixdb повертає 3, оскільки три рядки містять movie_id 2.

КІЛЬКІСТЬ(`ідентифікатор_фільму`)
3

DISTINCT ключове слово

COUNT відповідає на «скільки». Наступне питання зазвичай «скільки різний «оні», і саме для цього існує DISTINCT.

DISTINCT ключове слово

Ключове слово DISTINCT виключає дублікати з наших результатів за групамиping однакові значення разом, саме так, як показано на ілюстрації вище.

Спочатку виконаємо простий запит.

SELECT `movie_id` FROM `movierentals`;
movie_id
1
2
2
2
3

Тепер той самий запит з ключовим словом DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

DISTINCT пропускає дублікати записів:

movie_id
1
2
3

COUNT проти COUNT(*) проти COUNT(DISTINCT): який з них слід використовувати?

DISTINCT також можна розмістити всередині агрегатна функція, і саме тут більшість початківців програють track з яких рядків фактично підраховано. Чотири форми нижче працюють з однією й тією ж таблицею movierentals з п'ятьма рядками, яку було показано раніше, але не всі вони повертають однакове число. Різниця зводиться до двох питань: чи підраховує форма рядки чи значення, і чи зберігає вона дублікати?

Форма Що це має значення Результат на прокаті фільмів
КІЛЬКІСТЬ(*) Кожен рядок, включаючи дублікати та рядки, які повністю мають значення NULL 5
КІЛЬКІСТЬ(`ідентифікатор_фільму`) Кожне значення, відмінне від NULL, у стовпці, включаючи дублікати 5
COUNT(`дата_повернення`) Тільки значення, відмінні від NULL — дві дати повернення NULL пропускаються 3
COUNT(DISTINCT `ідентифікатор_фільму`) Тільки унікальні значення, відмінні від NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Порада: Використовуйте COUNT(*) для підрахунку рядків, COUNT(стовпець), коли NULL має означати «не застосовується», та COUNT(DISTINCT стовпець) для унікальних значень. Протилежністю DISTINCT є ALL — значення за замовчуванням, тому його рідко записують.

Функція MIN

Функція MIN повертає найменше значення у вказаному полі таблиці.

Припустимо, нам потрібен рік виходу найстарішого фільму в нашій бібліотеці. MySQLФункція MIN дає нам це.

SELECT MIN(`year_released`) FROM `movies`;

Результат:

MIN(`рік_випуску`)
2005

Функція MAX

Як випливає з назви, функція MAX є протилежністю функції MIN. Це повертає найбільше значення з указаного поля таблиці.

Припустимо, нам потрібен рік виходу останнього фільму з нашої бази даних. Наступний приклад повертає його.

SELECT MAX(`year_released`) FROM `movies`;

Результат:

MAX(`рік_випуску`)
2012

Функція SUM

MIN та MAX вибирають існуюче значення зі стовпця. SUM та AVG обчисліть нове число з усього стовпця.

Припустимо, нам потрібна загальна сума платежів, здійснених на даний момент. MySQL SUM функція повертає суму всіх значень у вказаному стовпці. SUM працює лише з числовими полями та Значення NULL виключаються з результату.

У наступній таблиці наведено дані з таблиці платежів.

ідентифікатор платежу членський_ номер дата оплати description виплачувана сума зовнішній_посилальний_номер
1 1 23-07-2012 Оплата прокату фільму 2500 11
2 1 25-07-2012 Оплата прокату фільму 2000 12
3 3 30-07-2012 Оплата прокату фільму 6000 NULL

Наведений нижче запит отримує всі здійснені платежі та підсумовує їх в один результат: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Результат:

СУМ(`сума_сплачено`)
10500

AVG функція

Команда MySQL AVG функція повертає середнє значення у вказаному стовпці. Так само, як і функція SUM, це працює лише з числовими типами даних.

Припустимо, що нам потрібно знайти середню сплачену суму. Ми можемо використати наступний запит, який ділить загальну суму 10500 на три рядки платежів, що не є NULL.

SELECT AVG(`amount_paid`) FROM `payments`;

Результат:

AVG(`сума_сплачена`)
3500

⚠️ Попередження: AVG ділиться на кількість не-NULL рядків, а не на кількість рядків у таблиці. Значення NULL пропускається, а не вважається нулем, що непомітно збільшує середнє значення. Використовуйте AVG(IFNULL(`amount_paid`, 0)), коли відсутнє значення дорівнює нулю.

Практичний приклад: Поєднання агрегатних функцій з GROUP BY

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

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

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Виконання наведеного вище прикладу в MySQL Workbench дає нам такі результати.

AVG функція, що використовується з GROUP BY

Запит об'єднує дві таблиці в реченні WHERE — старішому стилі з'єднання комою. Сучасний код записує ту саму логіку, що й явний оператор ВНУТРІШНЄ З’ЄДНАННЯ … УВІМК.Зверніть також увагу, що кожен неагрегований стовпець у списку SELECT має відображатися в GROUP BY, або MySQL 5.7 та пізніших версій відхиляють запит за параметром ONLY_FULL_GROUP_BY. Див. офіційний MySQL посилання на агрегатну функцію.

Поширені запитання

Команда ДЕ ЗАКЛАД фільтрує окремі рядки перед обчисленням агрегату. HAVING фільтрує згруповані результати після цього, тому лише HAVING може посилатися на агрегат, такий як COUNT(*) або SUM(сума_сплачена).

Так. Без GROUP BY агрегат обробляє весь набір результатів як одну групу та повертає рівно один рядок. Додавання GROUP BY розбиває результат на один рядок для кожного окремого значення групи.

Так. На відміну від SUM та AVG, MIN та MAX працюють з будь-яким порівнянним типом. У текстовому стовпці вони повертають перше та останнє значення в алфавітному порядку, а у стовпці дати — найдавнішу та найпізнішу дати.

Так. Помічники з перетворення тексту в SQL перетворюють такі питання, як «середній платіж на учасника», у запит GROUP BY. Виконайте згенерований SQL у MySQL Верстак і перевірте кількість рядків, перш ніж довіряти цифрам.

Зазвичай причиною є обробка NULL та дублювання рядків об'єднання. Модель штучного інтелекту може вибрати COUNT(*) там, де потрібен COUNT(column), або двічі об'єднати таблицю, що завищує кожну суму SUM. Завжди перевіряйте на відоме число.

Підсумуйте цей пост за допомогою: