Wenn Sie MySQL verwenden, können Sie AVG()
verwenden Funktion zur Berechnung des Durchschnittswertes aus einer Reihe von Werten.
Sie können diese Funktion beispielsweise verwenden, um herauszufinden, wie hoch die durchschnittliche Stadtbevölkerung für ein bestimmtes Land oder Bundesland ist. Angenommen, ein Land hat viele Städte mit jeweils unterschiedlichen Einwohnerzahlen, können Sie den Durchschnitt zwischen ihnen herausfinden. Eine Stadt hat vielleicht 50.000 Einwohner, während eine andere 500.000 Einwohner hat. Der AVG()
berechnet den Durchschnitt für Sie.
Syntax
Die Syntax von AVG()
geht so:
AVG([DISTINCT] expr) [over_clause]
Wobei expr
ist der Ausdruck, für den Sie den Durchschnitt wünschen.
Die over_clause
ist eine optionale Klausel, die mit Fensterfunktionen arbeitet. Die Funktionsweise von Fensterfunktionen besteht darin, dass für jede Zeile einer Abfrage eine Berechnung unter Verwendung von Zeilen durchgeführt wird, die sich auf diese Zeile beziehen. In diesem Fall die over_clause
gibt an, wie Abfragezeilen zur Verarbeitung durch die Fensterfunktion in Gruppen aufgeteilt werden. Beachten Sie, dass die over_clause
kann nur verwendet werden, wenn Sie den DISTINCT
nicht verwenden Schlüsselwort.
Rohdaten
Hier sind zunächst die Rohdaten, die wir für die Beispiele auf dieser Seite verwenden:
SELECT Name, District, PopulationFROM CityWHERE CountryCode ='AUS';
Ergebnis:
+----------+----------------+----------- +| Name | Bezirk | Bevölkerung |+----------+----------------+------------+ | Sydney | Neusüdwales | 3276207 || Melbourne | Viktoria | 2865329 || Brisbane | Queensland | 1291117 || Perth | Westaustralien | 1096829 || Adelheid | Südaustralien | 978100 || Canberra | Hauptstadtregion | 322723 || Goldküste | Queensland | 311932 || Neuburg | Neusüdwales | 270324 || Zentrale Küste | Neusüdwales | 227657 || Wollongong | Neusüdwales | 219761 || Hobart | Tasmanien | 126118 || Geelong | Viktoria | 125382 || Stadtville | Queensland | 109914 || Steinhaufen | Queensland | 92273 |+---------------+----------------+------------+
Einfaches Beispiel
Wie Sie den obigen Rohdaten entnehmen können, haben einige „Distrikte“ mehr als eine Stadt, und jede Stadt hat eine andere Bevölkerung. Wir können den AVG()
verwenden Funktion, um die durchschnittliche Bevölkerung der Städte in jedem Bezirk zu ermitteln:
SELECT District, AVG(Population) AS 'Average Population'FROM CityWHERE CountryCode ='AUS'AND District ='New South Wales';
Ergebnis:
+------------+--------------------+| Bezirk | Durchschnittliche Bevölkerung |+------------+--------------------+| Neusüdwales | 998487.2500 |+------------+--------------------+
Wir können also sehen, dass New South Wales eine durchschnittliche Stadtbevölkerung von 998487,2500 hat.
Rundung des Durchschnitts
Sie haben wahrscheinlich bemerkt, dass das Ergebnis aus dem vorherigen Beispiel ziemlich genau war – es lieferte ein Ergebnis mit vier Dezimalstellen. In unserem Fall ist das wahrscheinlich etwas zu viel. Wir brauchen kein Ergebnis bis zur vierten Dezimalstelle. Daher können wir den ROUND()
verwenden Funktion, um es auf die nächste ganze Zahl zu runden (oder auf eine bestimmte Anzahl von Dezimalstellen, wenn wir dies wünschen).
Hier ist ein Beispiel für das Runden des Ergebnisses auf die nächste ganze Zahl:
SELECT District, ROUND(AVG(Population)) AS 'Average Population'FROM CityWHERE CountryCode ='AUS'AND District ='New South Wales';
Ergebnis:
+------------+--------------------+| Bezirk | Durchschnittliche Bevölkerung |+------------+--------------------+| Neusüdwales | 998487 |+------------+--------------------+
Standardmäßig ist das ROUND()
Funktion rundet auf die nächste ganze Zahl. Alternativ hätten wir ein zweites Argument angeben können, um eine Anzahl von Dezimalstellen anzugeben, aber in diesem Fall wollen wir das nicht.
Die GROUP BY-Klausel
Wir können den GROUP BY
verwenden Klausel zur Auflistung aller Bezirke/Staaten zusammen mit ihrer durchschnittlichen Stadtbevölkerung:
SELECT District, ROUND(AVG(Population)) AS 'Average Population'FROM CityWHERE CountryCode ='AUS'GROUP BY District;
Ergebnis:
+------------+--------------------+| Bezirk | Durchschnittliche Bevölkerung |+------------+--------------------+| Neusüdwales | 998487 || Viktoria | 1495356 || Queensland | 451309 || Westaustralien | 1096829 || Südaustralien | 978100 || Hauptstadtregion | 322723 || Tasmanien | 126118 |+------------+--------------------+
Die ORDER BY-Klausel
Wir können auch den ORDER BY
verwenden -Klausel, um eine Spalte anzugeben, nach der sortiert werden soll:
SELECT District, ROUND(AVG(Population)) AS 'Average Population'FROM CityWHERE CountryCode ='AUS'GROUP BY DistrictORDER BY `Average Population`;
Ergebnis:
+------------+--------------------+| Bezirk | Durchschnittliche Bevölkerung |+------------+--------------------+| Tasmanien | 126118 || Hauptstadtregion | 322723 || Queensland | 451309 || Südaustralien | 978100 || Neusüdwales | 998487 || Westaustralien | 1096829 || Viktoria | 1495356 |+------------+--------------------+
Beachten Sie, dass bei der Bestellung nach einem aus mehreren Wörtern bestehenden Alias (wie `Average Population`
), müssen Sie das Backtick-Zeichen (`
) verwenden ) anstelle des Apostrophs ('
), um die beiden Wörter einzuschließen.
Finden Sie die durchschnittliche Zeichenlänge
Der AVG()
Die Funktion ist nicht auf Spalten mit numerischen Daten beschränkt. Sie können auch AVG()
kombinieren mit anderen Funktionen, um Durchschnittswerte in anderen Bereichen zu finden.
Anhand unserer Beispieldaten können wir beispielsweise die durchschnittliche Zeichenlänge aller Werte in City
finden Spalte:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Durchschnittliche Zeichenlänge'FROM cityWHERE CountryCode ='AUS'AND District ='New South Wales';
Ergebnis:
+---------------------+| Durchschnittliche Zeichenlänge |+---------------------+| 10 |+---------------------+
Eine OVER-Klausel verwenden
Wie bereits erwähnt, erlaubt die Syntax ein OVER
Klausel, die in Ihre Abfragen aufgenommen werden soll. Das kann etwas komplex werden, aber im Grunde ist das OVER
-Klausel können Sie angeben, wie Abfragezeilen zur Verarbeitung durch die Fensterfunktion in Gruppen aufgeteilt werden.
Hier ist ein Beispiel:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg'FROM CityWHERE CountryCode ='AUS'ORDER BY District;
Ergebnis:
In diesem Beispiel werden die Zeilen nach District
partitioniert , wobei der Durchschnitt für jede Partition (Distrikt) bereitgestellt wird. Auf diese Weise können Sie detailliertere Daten anzeigen, z. B. die Stadtbevölkerung, zusammen mit der durchschnittlichen Bevölkerung des Bezirks, zu dem sie gehört.