I SQL er MAX()
funktion er en aggregeret funktion, der returnerer den maksimale værdi i et givet udtryk.
Nedenfor er nogle grundlæggende eksempler for at demonstrere, hvordan det virker.
Eksempeltabel
Antag, at vi har følgende tabel:
SELECT * FROM Products;
Resultat:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Eksempel
Vi kan bruge følgende forespørgsel til at få den maksimale pris fra den tabel.
SELECT MAX(ProductPrice)
FROM Products;
Resultat:
+--------------------+ | (No column name) | |--------------------| | 245.00 | +--------------------+
I dette tilfælde gemmes prisoplysninger i ProductPrice
kolonne, og så sender vi det som et argument til MAX()
funktion, som derefter beregner og returnerer resultatet.
Brug af kolonnealiaser
Du vil bemærke, at de tidligere resultater ikke indeholder et kolonnenavn. Nogle DBMS'er kan bruge noget som MAX(ProductPrice)
som kolonnenavn. Dette kan forventes, fordi MAX()
funktion returnerer ikke nogen kolonner. Du kan nemt angive et kolonnenavn ved at tildele et alias.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
Resultat:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
Filtrerede resultater
MAX()
funktionen fungerer på de rækker, der returneres af forespørgslen. Så hvis du filtrerer resultaterne, er resultatet af MAX()
vil afspejle det.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;
Resultat:
+----------------+ | MaximumPrice | |----------------| | 25.99 | +----------------+
I dette tilfælde er 25,99 den maksimale pris for alle de produkter, der tilbydes af den angivne leverandør.
NULL
Værdier
MAX()
funktionen ignorerer enhver NULL
værdier. I vores eksempeltabel ovenfor, produktnummer 6
har fået NULL
i dens ProductPrice
kolonne, men det blev ignoreret i vores MAX()
eksempel.
Afhængigt af dit DBMS og dine indstillinger kan du muligvis se en advarsel, der NULL
værdier blev elimineret i resultatsættet.
Her er et eksempel på, hvad du kan se:
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
Resultat:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Alt dette fortæller os er, at kolonnen indeholdt mindst én NULL
værdi, og at den blev ignoreret ved beregning af resultaterne.
Data-/tidsdata
Du kan bruge MAX()
på dato/tidsværdier.
Antag, at vi har følgende tabel:
SELECT PetName, DOB
FROM Pets;
Resultat:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
Vi kan bruge MAX()
for at finde den maksimale fødselsdato (DOB
).
SELECT MAX(DOB) AS MaxDOB
FROM Pets;
Resultat:
+------------+ | MaxDOB | |------------| | 2020-11-28 | +------------+
Dette ville være fødselsdatoen for det yngste kæledyr. Som nævnt ignorerer den enhver NULL
værdier.
Tegndata
Når det bruges sammen med tegndatakolonner, MAX()
finder den værdi, der er højest i sorteringssekvensen.
Eksempel:
SELECT MAX(ProductName) AS MaximumProductName
FROM Products;
Resultat:
+----------------------+ | MaximumProductName | |----------------------| | Straw Dog Box | +----------------------+
DISTINCT
Søgeord
Dit DBMS tillader muligvis DISTINCT
nøgleord, der skal bruges med MAX()
fungere. Hvis det er tilfældet, er dette sandsynligvis for at overholde ISO SQL-standarden.
Derfor kan du muligvis gøre dette:
SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;
Resultat:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
Men det vil ikke have nogen indflydelse på resultaterne.
DISTINCT
Nøgleord kan være meget nyttigt, når det bruges sammen med andre sammenhænge (f.eks. med COUNT()
funktion), men den har ingen betydning, når den bruges sammen med MAX()
. DISTINCT
søgeord fjerner dubletter, men i tilfælde af MAX()
det vil ikke gøre nogen forskel, fordi MAX()
returnerer det samme resultat, uanset hvor mange rækker der deler den samme maksimale værdi.
Vinduefunktioner
Afhængigt af dit DBMS, kan du muligvis bruge en OVER
klausul med din MAX()
funktion for at oprette en vinduesfunktion.
En vinduesfunktion udfører en aggregatlignende operation på et sæt forespørgselsrækker. Det producerer et resultat for hver forespørgselsrække. Dette er i modsætning til en aggregeret operation, som grupperer forespørgselsrækker i en enkelt resultatrække.
Her er et eksempel for at demonstrere konceptet.
Vi har allerede set Products
bord. Vores database har også en Customers
tabel, og den indeholder følgende data:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 1254 | AUS | (415) 413-5182 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
Vi kan hente data fra disse tabeller og præsentere dem som ét resultatsæt ved at bruge en join.
Vi kan også bruge MAX()
funktion med OVER
klausul for at anvende en vinduesfunktion til dataene.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MAX(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Maximum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Maximum Price For This Vendor";
Resultat:
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Maximum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 25.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 25.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 25.99 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+---------------------------------+
I dette tilfælde brugte vi OVER
klausul med vores MAX()
funktion til at opdele resultatet efter leverandørnavn.
Ved at gøre dette var vi i stand til at returnere prisoplysninger for hvert produkt, såvel som maksimumprisen for alle produkter fra den pågældende leverandør. Denne maksimale pris ændres, efterhånden som leverandøren ændres (medmindre flere leverandører tilfældigvis har den samme maksimumpris), men forbliver den samme for alle produkter fra den samme leverandør.
Dette koncept kan også anvendes på andre aggregerede funktioner i SQL, såsom SUM()
, MIN()
, AVG()
, og COUNT()
.