Używając MySQL, możesz użyć AVG()
funkcja do obliczenia średniej wartości z zakresu wartości.
Na przykład możesz użyć tej funkcji, aby dowiedzieć się, jaka jest średnia populacja miasta dla danego kraju lub stanu. Biorąc pod uwagę, że kraj będzie miał wiele miast, każde z inną populacją, możesz dowiedzieć się, jaka jest średnia między nimi. Jedno miasto może mieć populację, powiedzmy, 50 000, podczas gdy inne ma populację 500 000. AVG()
funkcja obliczy średnią dla Ciebie.
Składnia
Składnia AVG()
idzie tak:
AVG([DISTINCT] expr) [over_clause]
Gdzie expr
to wyrażenie, dla którego chcesz uzyskać średnią.
over_clause
to opcjonalna klauzula, która działa z funkcjami okna. Sposób działania funkcji okna polega na tym, że dla każdego wiersza z zapytania wykonaj obliczenia, używając wierszy powiązanych z tym wierszem. W tym przypadku over_clause
określa sposób podziału wierszy zapytań na grupy w celu przetworzenia przez funkcję okna. Zwróć uwagę, że over_clause
można użyć tylko wtedy, gdy nie używasz DISTINCT
słowo kluczowe.
Nieprzetworzone dane
Po pierwsze, oto surowe dane, których użyjemy w przykładach na tej stronie:
SELECT Name, District, Population FROM City WHERE CountryCode = 'AUS';
Wynik:
+---------------+-----------------+------------+ | 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 | +---------------+-----------------+------------+
Przykład podstawowy
Jak widać z surowych danych powyżej, niektóre „dzielnice” mają więcej niż jedno miasto, a każde miasto ma inną populację. Możemy użyć AVG()
funkcja znajdowania średniej populacji miast w obrębie każdej dzielnicy:
SELECT District, AVG(Population) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Wynik:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487.2500 | +-----------------+--------------------+
Widzimy więc, że Nowa Południowa Walia ma średnią populację miasta wynoszącą 998487.2500.
Zaokrąglanie średniej
Zapewne zauważyłeś, że wynik z poprzedniego przykładu był dość precyzyjny – zwracał wynik do czterech miejsc po przecinku. W naszym przypadku to chyba trochę za dużo. Nie potrzebujemy wyniku do czwartego miejsca po przecinku. Dlatego możemy użyć ROUND()
funkcja zaokrąglająca go do najbliższej liczby całkowitej (lub do określonej liczby miejsc po przecinku, jeśli sobie tego życzymy).
Oto przykład zaokrąglania wyniku do najbliższej liczby całkowitej:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Wynik:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | +-----------------+--------------------+
Domyślnie ROUND()
funkcja zaokrągla do najbliższej liczby całkowitej. Alternatywnie moglibyśmy podać drugi argument, aby określić liczbę miejsc dziesiętnych, ale w tym przypadku tego nie chcemy.
Klauzula GROUP BY
Możemy użyć GROUP BY
klauzula o wymienieniu każdego okręgu/stanu wraz z ich średnią populacją miast:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Wynik:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | | Victoria | 1495356 | | Queensland | 451309 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+--------------------+
Klauzula ORDER BY
Możemy również użyć ORDER BY
klauzula określająca kolumnę, z którą należy zamawiać według:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Average Population`;
Wynik:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | Tasmania | 126118 | | Capital Region | 322723 | | Queensland | 451309 | | South Australia | 978100 | | New South Wales | 998487 | | West Australia | 1096829 | | Victoria | 1495356 | +-----------------+--------------------+
Zwróć uwagę, że przy zamawianiu za pomocą wielowyrazowego aliasu (np. `Average Population`
), musisz użyć znaku backticka (`
) zamiast apostrofu ('
), aby otoczyć te dwa słowa.
Znajdź średnią długość znaków
AVG()
funkcja nie ogranicza się tylko do kolumn z danymi liczbowymi. Możesz także połączyć AVG()
z innymi funkcjami, aby znaleźć średnie w innych obszarach.
Na przykład, korzystając z naszych przykładowych danych, możemy znaleźć średnią długość znaków wszystkich wartości w City
kolumna:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length' FROM city WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Wynik:
+--------------------------+ | Average Character Length | +--------------------------+ | 10 | +--------------------------+
Korzystanie z klauzuli OVER
Jak wspomniano, składnia pozwala na OVER
klauzulę, którą należy uwzględnić w zapytaniach. Może się to nieco skomplikować, ale zasadniczo OVER
klauzula pozwala określić sposób podziału wierszy zapytań na grupy do przetworzenia przez funkcję okna.
Oto przykład:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg' FROM City WHERE CountryCode = 'AUS' ORDER BY District;
Wynik:
+-----------------+---------------+------------+--------------+ | 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 | +-----------------+---------------+------------+--------------+
Ten przykład dzieli wiersze według District
, podając średnią dla każdej partycji (dzielnicy). Pozwala to zobaczyć bardziej szczegółowe dane, takie jak populacja miasta, wraz ze średnią populacją dzielnicy, do której należy.