MySQL MAX()
function to funkcja agregująca, która zwraca maksymalną wartość z wyrażenia.
Zazwyczaj wyrażenie będzie zakresem wartości zwracanych jako oddzielne wiersze w kolumnie i można użyć tej funkcji, aby znaleźć maksymalną wartość z zwracanych wierszy. Jeśli nie ma pasujących wierszy, MAX()
zwraca NULL
.
Na przykład możesz użyć tej funkcji, aby dowiedzieć się, które miasto ma największą populację z listy miast.
Składnia
Składnia MAX()
idzie tak:
MAX([DISTINCT] expr) [over_clause]
Gdzie expr
to wyrażenie, dla którego chcesz uzyskać maksymalną wartość.
over_clause
to opcjonalna klauzula, która działa z funkcjami okna. Zwróć uwagę, że over_clause
można użyć tylko wtedy, gdy nie używasz DISTINCT
słowo kluczowe.
(Opcjonalnie) DISTINCT
słowo kluczowe może zostać użyte do wyeliminowania zduplikowanych wartości.
Przykład podstawowy
Po pierwsze, oto surowe dane, których użyjemy w tym przykładzie:
USE world; SELECT Name, Population FROM City WHERE CountryCode = 'THA';
Wynik:
+-------------------+------------+ | Name | Population | +-------------------+------------+ | Bangkok | 6320174 | | Nonthaburi | 292100 | | Nakhon Ratchasima | 181400 | | Chiang Mai | 171100 | | Udon Thani | 158100 | | Hat Yai | 148632 | | Khon Kaen | 126500 | | Pak Kret | 126055 | | Nakhon Sawan | 123800 | | Ubon Ratchathani | 116300 | | Songkhla | 94900 | | Nakhon Pathom | 94100 | +-------------------+------------+
Możemy użyć MAX()
funkcja znajdowania miasta o największej populacji (tj. wiersz z maksymalną wartością w kolumnie populacji).
USE world; SELECT MAX(Population) AS 'Maximum Value' FROM City WHERE CountryCode = 'THA';
Wynik:
+---------------+ | Maximum Value | +---------------+ | 6320174 | +---------------+
Klauzula GROUP BY
Możemy użyć GROUP BY
klauzula, aby wymienić każdy kraj wraz z populacją największego miasta tego kraju (według liczby ludności):
USE world; SELECT District, MAX(Population) AS 'Max Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Wynik:
+-----------------+-----------+ | District | Max Value | +-----------------+-----------+ | New South Wales | 3276207 | | Victoria | 2865329 | | Queensland | 1291117 | | 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:
USE world; SELECT District, MAX(Population) AS 'Max Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Max Value` ASC;
Wynik:
+-----------------+-----------+ | District | Max Value | +-----------------+-----------+ | Tasmania | 126118 | | Capital Region | 322723 | | South Australia | 978100 | | West Australia | 1096829 | | Queensland | 1291117 | | Victoria | 2865329 | | New South Wales | 3276207 | +-----------------+-----------+
Powoduje to uporządkowanie wyników w porządku rosnącym, w którym najpierw jest wyświetlana minimalna wartość.
Zwróć uwagę, że przy zamawianiu za pomocą wielowyrazowego aliasu (np. `Max Value`
), musisz użyć znaku backticka (`
) zamiast apostrofu ('
), aby otoczyć te dwa słowa.
Znajdź maksymalną długość znaków
MAX()
funkcja nie ogranicza się tylko do kolumn z danymi liczbowymi. Możesz także połączyć MAX()
z innymi funkcjami, aby zwrócić maksymalne wartości w innych obszarach.
Na przykład, korzystając z naszych przykładowych danych, możemy znaleźć wartość z maksymalną liczbą znaków w City
kolumna:
SELECT MAX(CHAR_LENGTH(Name)) AS 'Maximum Character Length' FROM city;
Wynik:
+--------------------------+ | Maximum Character Length | +--------------------------+ | 34 | +--------------------------+
Możemy to również zobaczyć za pomocą następującego zapytania (które nie obejmuje MAX()
funkcja):
SELECT Name, CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` DESC LIMIT 10;
Wynik:
+--------------------------------------+------------------+ | Name | Character Length | +--------------------------------------+------------------+ | Luxembourg [Luxemburg/Lëtzebuerg] | 34 | | Castellón de la Plana [Castell | 31 | | San Fernando del Valle de Cata | 30 | | Santo Domingo de los Colorados | 30 | | Thiruvananthapuram (Trivandrum | 30 | | [San Cristóbal de] la Laguna | 29 | | Ingraj Bazar (English Bazar) | 28 | | Soledad de Graciano Sánchez | 28 | | Valle de Chalco Solidaridad | 27 | | Machilipatnam (Masulipatam) | 27 | +--------------------------------------+------------------+
Korzystanie z klauzuli OVER
Jak wspomniano, składnia pozwala na OVER
klauzulę, którą należy uwzględnić w zapytaniach. 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 AS 'City Population', MAX(Population) OVER(PARTITION BY District) AS 'District Max' FROM City WHERE CountryCode = 'AUS' ORDER BY `District Max` DESC;
Wynik:
+-----------------+---------------+-----------------+--------------+ | District | City | City Population | District Max | +-----------------+---------------+-----------------+--------------+ | New South Wales | Sydney | 3276207 | 3276207 | | New South Wales | Wollongong | 219761 | 3276207 | | New South Wales | Newcastle | 270324 | 3276207 | | New South Wales | Central Coast | 227657 | 3276207 | | Victoria | Melbourne | 2865329 | 2865329 | | Victoria | Geelong | 125382 | 2865329 | | Queensland | Townsville | 109914 | 1291117 | | Queensland | Brisbane | 1291117 | 1291117 | | Queensland | Cairns | 92273 | 1291117 | | Queensland | Gold Coast | 311932 | 1291117 | | West Australia | Perth | 1096829 | 1096829 | | South Australia | Adelaide | 978100 | 978100 | | Capital Region | Canberra | 322723 | 322723 | | Tasmania | Hobart | 126118 | 126118 | +-----------------+---------------+-----------------+--------------+
Ten przykład dzieli wiersze według District
, podając maksymalną wartość dla każdej partycji (dystryktu). Dzięki temu możesz zobaczyć bardziej szczegółowe dane, takie jak populacja każdego miasta, wraz z populacją największego miasta w tej samej dzielnicy.