MySQL MAX()
funktion är en aggregerad funktion som returnerar det maximala värdet från ett uttryck.
Vanligtvis skulle uttrycket vara ett värdeintervall som returneras som separata rader i en kolumn, och du kan använda den här funktionen för att hitta det maximala värdet från de returnerade raderna. Om det inte finns några matchande rader, MAX()
returnerar NULL
.
Du kan till exempel använda den här funktionen för att ta reda på vilken stad som har den största befolkningen av en lista med städer.
Syntax
Syntaxen för MAX()
går så här:
MAX([DISTINCT] expr) [over_clause]
Där expr
är uttrycket som du vill ha det maximala värdet för.
over_clause
är en valfri klausul som fungerar med fönsterfunktioner. Observera att over_clause
kan endast användas om du inte använder DISTINCT
nyckelord.
Den (valfria) DISTINCT
nyckelord kan användas för att eliminera dubbletter av värden.
Grundläggande exempel
Först, här är rådata som vi kommer att använda i det här exemplet:
USE world; SELECT Name, Population FROM City WHERE CountryCode = 'THA';
Resultat:
+-------------------+------------+ | 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 | +-------------------+------------+
Vi kan använda MAX()
funktion för att hitta staden med den största befolkningen (dvs. raden med det maximala värdet i sin befolkningskolumn).
USE world; SELECT MAX(Population) AS 'Maximum Value' FROM City WHERE CountryCode = 'THA';
Resultat:
+---------------+ | Maximum Value | +---------------+ | 6320174 | +---------------+
GROUP BY-klausulen
Vi kan använda GROUP BY
klausul för att lista ut varje land, tillsammans med befolkningen i landets största stad (efter befolkning):
USE world; SELECT District, MAX(Population) AS 'Max Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Resultat:
+-----------------+-----------+ | District | Max Value | +-----------------+-----------+ | New South Wales | 3276207 | | Victoria | 2865329 | | Queensland | 1291117 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+-----------+
ORDER BY-klausulen
Vi kan också använda ORDER BY
sats för att ange en kolumn som du kan beställa efter:
USE world; SELECT District, MAX(Population) AS 'Max Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Max Value` ASC;
Resultat:
+-----------------+-----------+ | District | Max Value | +-----------------+-----------+ | Tasmania | 126118 | | Capital Region | 322723 | | South Australia | 978100 | | West Australia | 1096829 | | Queensland | 1291117 | | Victoria | 2865329 | | New South Wales | 3276207 | +-----------------+-----------+
Detta ordnar resultaten i stigande ordning, som listar minimivärdet först.
Observera att när du beställer efter ett alias med flera ord (som `Max Value`
), måste du använda backteck-tecknet (`
) istället för apostrof ('
) för att omge de två orden.
Hitta den maximala teckenlängden
MAX()
Funktionen är inte begränsad till bara kolumner med numeriska data. Du kan också kombinera MAX()
med andra funktioner för att returnera maximala värden i andra områden.
Med hjälp av våra exempeldata kan vi till exempel hitta värdet med maximalt antal tecken i City
kolumn:
SELECT MAX(CHAR_LENGTH(Name)) AS 'Maximum Character Length' FROM city;
Resultat:
+--------------------------+ | Maximum Character Length | +--------------------------+ | 34 | +--------------------------+
Vi kan också se detta genom att använda följande fråga (som inte involverar MAX()
funktion):
SELECT Name, CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` DESC LIMIT 10;
Resultat:
+--------------------------------------+------------------+ | 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 | +--------------------------------------+------------------+
Använda en OVER-klausul
Som nämnts tillåter syntaxen en OVER
klausul som ska inkluderas i dina frågor. I princip OVER
sats låter dig specificera hur du partitionerar frågerader i grupper för bearbetning av fönsterfunktionen.
Här är ett exempel:
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;
Resultat:
+-----------------+---------------+-----------------+--------------+ | 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 | +-----------------+---------------+-----------------+--------------+
Det här exemplet delar upp raderna efter District
, ger det maximala värdet för varje partition (distrikt). Detta gör att du kan se mer detaljerad information, som varje stads befolkning, tillsammans med befolkningen i den största staden i samma distrikt.