MySQL MAX()
funktion er en aggregeret funktion, der returnerer den maksimale værdi fra et udtryk.
Typisk vil udtrykket være et interval af værdier, der returneres som separate rækker i en kolonne, og du kan bruge denne funktion til at finde den maksimale værdi fra de returnerede rækker. Hvis der ikke er nogen matchende rækker, MAX()
returnerer NULL
.
For eksempel kan du bruge denne funktion til at finde ud af, hvilken by der har den største befolkning ud af en liste over byer.
Syntaks
Syntaksen for MAX()
går sådan her:
MAX([DISTINCT] expr) [over_clause]
Hvor expr
er det udtryk, du vil have den maksimale værdi for.
over_clause
er en valgfri klausul, der fungerer med vinduesfunktioner. Bemærk, at over_clause
kan kun bruges, hvis du ikke bruger DISTINCT
søgeord.
Den (valgfri) DISTINCT
søgeord kan bruges til at eliminere duplikerede værdier.
Grundlæggende eksempel
For det første er her de rå data, som vi vil bruge i dette eksempel:
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 bruge MAX()
funktion til at finde byen med den største befolkning (dvs. rækken med den maksimale værdi i dens befolkningskolonne).
USE world; SELECT MAX(Population) AS 'Maximum Value' FROM City WHERE CountryCode = 'THA';
Resultat:
+---------------+ | Maximum Value | +---------------+ | 6320174 | +---------------+
GROUP BY-klausulen
Vi kan bruge GROUP BY
klausul for at angive hvert land sammen med befolkningen i landets største by (efter indbyggertal):
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 også bruge ORDER BY
klausul for at specificere en kolonne, der skal bestilles 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 | +-----------------+-----------+
Dette ordner resultaterne i stigende rækkefølge, som viser minimumværdien først.
Bemærk, at når du bestiller efter et alias med flere ord (som `Max Value`
), skal du bruge backtick-tegnet (`
) i stedet for apostrof ('
) for at omgive de to ord.
Find den maksimale tegnlængde
MAX()
funktion er ikke begrænset til kun kolonner med numeriske data. Du kan også kombinere MAX()
med andre funktioner for at returnere maksimale værdier i andre områder.
Ved at bruge vores eksempeldata kan vi f.eks. finde værdien med det maksimale antal tegn i City
kolonne:
SELECT MAX(CHAR_LENGTH(Name)) AS 'Maximum Character Length' FROM city;
Resultat:
+--------------------------+ | Maximum Character Length | +--------------------------+ | 34 | +--------------------------+
Vi kan også se dette ved at bruge følgende forespørgsel (som ikke involverer 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 | +--------------------------------------+------------------+
Brug af en OVER-klausul
Som nævnt tillader syntaksen en OVER
klausul, der skal inkluderes i dine forespørgsler. 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 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 | +-----------------+---------------+-----------------+--------------+
Dette eksempel opdeler rækkerne efter District
, der giver den maksimale værdi for hver partition (distrikt). Dette giver dig mulighed for at se mere detaljerede data, såsom hver bys befolkning, sammen med befolkningen i den største by i samme distrikt.