Агрегатни функции в MySQL

Агрегираните функции са всичко

  • Извършване на изчисления на множество редове
  • От една колона от таблица
  • И връща една единствена стойност.

Стандартът ISO дефинира пет (5) агрегатни функции, а именно;

1) БРОЯ
2) СУМА
3) AVG
4) МИН
5) МАКС

Защо да използвате агрегатни функции

От гледна точка на бизнеса различните организационни нива имат различни информационни изисквания. Мениджърите от най-високо ниво обикновено се интересуват да знаят цели цифри и не са необходими отделните подробности.

Агрегираните функции ни позволяват лесно да произвеждаме обобщени данни от нашата база данни.

Например от нашата база данни myflix ръководството може да изисква следните отчети

  • Най-малко наети филми.
  • Най-наемани филми.
  • Среден брой на наети филми за един месец.

Ние лесно създаваме горните отчети, като използваме агрегатни функции.

Нека разгледаме подробно агрегатните функции.

COUNT функция

Функцията COUNT връща общия брой стойности в указаното поле. Работи както с числови, така и с нечислови типове данни. Всички агрегатни функции по подразбиране изключват нулеви стойности, преди да работят върху данните.

COUNT (*) е специална реализация на функцията COUNT, която връща броя на всички редове в определена таблица. COUNT (*) също взема предвид нули и дубликати.

Показаната по-долу таблица показва данни в таблицата с филми под наем

референтен_ номер дата на транзакцията дата_на_връщане членски_ номер 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 ни дава следните резултати.

COUNT('movie_id')
3

DISTINCT Ключова дума

DISTINCT Ключова дума

Ключовата дума DISTINCT, която ни позволява да пропускаме дубликати от нашите резултати. Това се постига чрез групиране на подобни стойности заедно.

За да оцените концепцията за Distinct, нека изпълним проста заявка

SELECT `movie_id` FROM `movierentals`;

movie_id
1
2
2
2
3

Сега нека изпълним същата заявка с отделната ключова дума-

SELECT DISTINCT `movie_id` FROM `movierentals`;

Както е показано по-долу, distinct пропуска дублиращи се записи от резултатите.

movie_id
1
2
3

MIN функция

Функцията MIN връща най-малката стойност в указаното поле на таблицата.

Като пример, да предположим, че искаме да знаем годината, в която е пуснат най-старият филм в нашата библиотека, можем да използваме MySQLфункция MIN, за да получите желаната информация.

Следното запитване ни помага да постигнем това

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

Изпълнение на горната заявка в MySQL workbench срещу myflixdb ни дава следните резултати.

MIN('year_released')
2005

Функция MAX

Точно както подсказва името, функцията MAX е противоположна на функцията MIN. то връща най-голямата стойност от указаното поле на таблицата.

Да предположим, че искаме да получим годината, в която е пуснат най-новият филм в нашата база данни. Можем лесно да използваме функцията MAX, за да постигнем това.

Следващият пример връща последната издадена филмова година.

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

Изпълнение на горната заявка в MySQL workbench с помощта на myflixdb ни дава следните резултати.

MAX('year_released')
2012

Функция SUM

Да предположим, че искаме отчет, който дава общата сума на извършените досега плащания. Можем да използваме MySQL SUM функция, която връща сумата от всички стойности в указаната колона. SUM работи само с числови полета. Нулевите стойности се изключват от върнатия резултат.

Следващата таблица показва данните в таблицата с плащания-

плащане_ид членски_ номер дата на плащане_ описание сума_ платена външен_референтен_номер
1 1 23-07-2012 Плащане за наем на филм 2500 11
2 1 25-07-2012 Плащане за наем на филм 2000 12
3 3 30-07-2012 Плащане за наем на филм 6000 NULL

Заявката, показана по-долу, получава всички извършени плащания и ги сумира, за да върне един резултат.

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

Изпълнение на горната заявка в MySQL workbench срещу myflixdb дава следните резултати.

SUM('amount_paid')
10500

AVG функция

MySQL AVG функция връща средната стойност на стойностите в определена колона. Точно като функцията SUM, тя работи само с числови типове данни.

Да предположим, че искаме да намерим средната платена сума. Можем да използваме следната заявка –

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

Изпълнение на горната заявка в MySQL работна маса, ни дава следните резултати.

AVG('amount_paid')
3500

Главоблъсканица

Мислите, че агрегатните функции са лесни. Опитайте това!

Следващият пример групира членовете по име, отчита общия брой плащания, средната сума на плащането и общия сбор на сумите на плащането.

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 функция

Oбобщение

  • MySQL поддържа всичките пет (5) стандартни ISO агрегатни функции COUNT, SUM, AVG, МИН и МАКС.
  • SUM и AVG функциите работят само с числови данни.
  • Ако искате да изключите дублиращи се стойности от резултатите от обобщената функция, използвайте ключовата дума DISTINCT. Ключовата дума ALL включва дори дубликати. Ако не е посочено нищо, ALL се приема за стандартно.
  • Агрегираните функции могат да се използват заедно с други SQL клаузи, като напр ГРУПИРАЙ ПО