Når du bruger MySQL, kan du bruge AVG()
funktion til at beregne gennemsnitsværdien ud fra en række værdier.
For eksempel kan du bruge denne funktion til at finde ud af, hvad den gennemsnitlige bybefolkning er for et givet land eller stat. Da et land vil have mange byer, hver med forskellige befolkninger, kan du finde ud af, hvad gennemsnittet er mellem dem. En by kan have en befolkning på f.eks. 50.000, mens en anden har en befolkning på 500.000. AVG()
funktion vil beregne gennemsnittet for dig.
Syntaks
Syntaksen for AVG()
går sådan her:
AVG([DISTINCT] expr) [over_clause]
Hvor expr
er det udtryk, du ønsker gennemsnittet for.
over_clause
er en valgfri klausul, der fungerer med vinduesfunktioner. Den måde, vinduesfunktioner fungerer på, er, at der for hver række fra en forespørgsel udføres en beregning ved hjælp af rækker relateret til den pågældende række. I dette tilfælde er over_clause
specificerer, hvordan forespørgselsrækker opdeles i grupper til behandling af vinduesfunktionen. Bemærk, at over_clause
kan kun bruges, hvis du ikke bruger DISTINCT
søgeord.
Rådata
For det første, her er de rå data, som vi vil bruge til eksemplerne på denne side:
SELECT Name, District, Population FROM City WHERE CountryCode = 'AUS';
Resultat:
+---------------+-----------------+------------+ | 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 | +---------------+-----------------+------------+
Grundlæggende eksempel
Som du kan se fra de rå data ovenfor, har nogle "distrikter" mere end én by, og hver by har en anden befolkning. Vi kan bruge AVG()
funktion til at finde den gennemsnitlige befolkning i byerne inden for hvert distrikt:
SELECT District, AVG(Population) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Resultat:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487.2500 | +-----------------+--------------------+
Så vi kan se, at New South Wales har en gennemsnitlig bybefolkning på 998487.2500.
Afrunding af gennemsnittet
Du har sikkert bemærket, at resultatet fra det forrige eksempel var ret præcist - det returnerede et resultat til fire decimaler. I vores tilfælde er det nok lidt for meget. Vi behøver ikke et resultat med fjerde decimal. Derfor kan vi bruge ROUND()
funktion til at afrunde det til nærmeste hele tal (eller til et bestemt antal decimaler, hvis vi ønsker det).
Her er et eksempel på afrunding af resultatet til nærmeste hele tal:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Resultat:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | +-----------------+--------------------+
Som standard er ROUND()
funktion afrunder til nærmeste hele tal. Alternativt kunne vi have givet et andet argument til at angive et antal decimaler, men i dette tilfælde ønsker vi det ikke.
GROUP BY-klausulen
Vi kan bruge GROUP BY
klausul for at angive hver distrikt/stat sammen med deres gennemsnitlige bybefolkning:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Resultat:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | | Victoria | 1495356 | | Queensland | 451309 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+--------------------+
ORDER BY-klausulen
Vi kan også bruge ORDER BY
klausul for at specificere en kolonne, der skal bestilles efter:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Average Population`;
Resultat:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | Tasmania | 126118 | | Capital Region | 322723 | | Queensland | 451309 | | South Australia | 978100 | | New South Wales | 998487 | | West Australia | 1096829 | | Victoria | 1495356 | +-----------------+--------------------+
Bemærk, at når du bestiller efter et alias med flere ord (som `Average Population`
), skal du bruge backtick-tegnet (`
) i stedet for apostrof ('
) for at omgive de to ord.
Find den gennemsnitlige tegnlængde
AVG()
funktion er ikke begrænset til kun kolonner med numeriske data. Du kan også kombinere AVG()
med andre funktioner for at finde gennemsnit i andre områder.
Ved at bruge vores eksempeldata kan vi f.eks. finde den gennemsnitlige tegnlængde for alle værdierne i City
kolonne:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length' FROM city WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Resultat:
+--------------------------+ | Average Character Length | +--------------------------+ | 10 | +--------------------------+
Brug af en OVER-klausul
Som nævnt tillader syntaksen en OVER
klausul, der skal inkluderes i dine forespørgsler. Dette kan blive lidt komplekst, men grundlæggende er OVER
klausul giver dig mulighed for at specificere, hvordan du opdeler forespørgselsrækker i grupper til behandling af vinduesfunktionen.
Her er et eksempel:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg' FROM City WHERE CountryCode = 'AUS' ORDER BY District;
Resultat:
+-----------------+---------------+------------+--------------+ | 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 | +-----------------+---------------+------------+--------------+
Dette eksempel opdeler rækkerne efter District
, der giver gennemsnittet for hver partition (distrikt). Dette giver dig mulighed for at se mere detaljerede data, såsom bybefolkningen, sammen med den gennemsnitlige befolkning for det distrikt, det hører hjemme i.