Когато използвате MySQL, можете да използвате AVG()
функция за изчисляване на средната стойност от диапазон от стойности.
Например, можете да използвате тази функция, за да разберете какво е средното население на града за дадена страна или щат. Като се има предвид, че една държава ще има много градове, всеки с различно население, можете да разберете каква е средната стойност между тях. Един град може да има население от 50 000, докато друг има население от 500 000. AVG()
функцията ще изчисли средната стойност за вас.
Синтаксис
Синтаксисът на AVG()
става така:
AVG([DISTINCT] expr) [over_clause]
Където expr
е изразът, за който искате средната стойност.
over_clause
е незадължителна клауза, която работи с функциите на прозореца. Начинът, по който работят функциите на прозореца, е, че за всеки ред от заявка се извършва изчисление, като се използват редове, свързани с този ред. В този случай over_clause
указва как да се разделят редовете на заявка на групи за обработка от функцията прозорец. Обърнете внимание, че over_clause
може да се използва само ако не използвате DISTINCT
ключова дума.
Необработени данни
Първо, ето необработените данни, които ще използваме за примерите на тази страница:
SELECT Name, District, Population FROM City WHERE CountryCode = 'AUS';
Резултат:
+---------------+-----------------+------------+ | Name | District | Population | +---------------+-----------------+------------+ | Sydney | New South Wales | 3276207 | | Melbourne | Victoria | 2865329 | | Brisbane | Queensland | 1291117 | | Perth | West Australia | 1096829 | | Adelaide | South Australia | 978100 | | Canberra | Capital Region | 322723 | | Gold Coast | Queensland | 311932 | | Newcastle | New South Wales | 270324 | | Central Coast | New South Wales | 227657 | | Wollongong | New South Wales | 219761 | | Hobart | Tasmania | 126118 | | Geelong | Victoria | 125382 | | Townsville | Queensland | 109914 | | Cairns | Queensland | 92273 | +---------------+-----------------+------------+
Основен пример
Както можете да видите от необработените данни по-горе, някои „области“ имат повече от един град и всеки град има различно население. Можем да използваме AVG()
функция за намиране на средното население на градовете във всеки район:
SELECT District, AVG(Population) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Резултат:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487.2500 | +-----------------+--------------------+
Така че можем да видим, че Нов Южен Уелс има средно градско население от 998487,2500.
Закръгляване на средната стойност
Вероятно сте забелязали, че резултатът от предишния пример е доста точен – връща резултат до четири знака след десетичната запетая. В нашия случай това вероятно е малко прекалено. Нямаме нужда от резултат до четвъртия знак след десетичната запетая. Следователно можем да използваме ROUND()
функция, за да го закръглите до най-близкото цяло число (или до определен брой десетични знаци, ако желаем).
Ето пример за закръгляне на резултата до най-близкото цяло число:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Резултат:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | +-----------------+--------------------+
По подразбиране ROUND()
функцията закръглява до най-близкото цяло число. Като алтернатива бихме могли да предоставим 2-ри аргумент, за да посочим няколко десетични знака, но в този случай не искаме това.
Клаузата GROUP BY
Можем да използваме GROUP BY
клауза за изброяване на всеки район/щат, заедно със средното им градско население:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Резултат:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | | Victoria | 1495356 | | Queensland | 451309 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+--------------------+
Клауза ORDER BY
Можем също да използваме ORDER BY
клауза, за да посочите колона, с която да подредите по:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Average Population`;
Резултат:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | Tasmania | 126118 | | Capital Region | 322723 | | Queensland | 451309 | | South Australia | 978100 | | New South Wales | 998487 | | West Australia | 1096829 | | Victoria | 1495356 | +-----------------+--------------------+
Имайте предвид, че когато поръчвате по псевдоним от няколко думи (като `Average Population`
), трябва да използвате символа за обратна отметка (`
) вместо апострофа ('
), за да обградите двете думи.
Намерете средната дължина на знака
AVG()
функцията не се ограничава само до колони с числови данни. Можете също да комбинирате AVG()
с други функции, за да намерите средни стойности в други области.
Например, използвайки нашите примерни данни, можем да намерим средната дължина на знаците на всички стойности в City
колона:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length' FROM city WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Резултат:
+--------------------------+ | Average Character Length | +--------------------------+ | 10 | +--------------------------+
Използване на клауза OVER
Както споменахме, синтаксисът позволява OVER
клауза, която да бъде включена във вашите запитвания. Това може да стане малко сложно, но по принцип OVER
Клаузата ви позволява да укажете как да разделяте редовете на заявка на групи за обработка от функцията прозорец.
Ето един пример:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg' FROM City WHERE CountryCode = 'AUS' ORDER BY District;
Резултат:
+-----------------+---------------+------------+--------------+ | District | City | Population | District Avg | +-----------------+---------------+------------+--------------+ | Capital Region | Canberra | 322723 | 322723 | | New South Wales | Sydney | 3276207 | 998487 | | New South Wales | Wollongong | 219761 | 998487 | | New South Wales | Newcastle | 270324 | 998487 | | New South Wales | Central Coast | 227657 | 998487 | | Queensland | Townsville | 109914 | 451309 | | Queensland | Brisbane | 1291117 | 451309 | | Queensland | Cairns | 92273 | 451309 | | Queensland | Gold Coast | 311932 | 451309 | | South Australia | Adelaide | 978100 | 978100 | | Tasmania | Hobart | 126118 | 126118 | | Victoria | Melbourne | 2865329 | 1495356 | | Victoria | Geelong | 125382 | 1495356 | | West Australia | Perth | 1096829 | 1096829 | +-----------------+---------------+------------+--------------+
Този пример разделя редовете по District
, предоставяйки средната стойност за всеки дял (район). Това ви позволява да видите по-подробни данни, като населението на града, заедно със средното население за областта, към която принадлежи.