I SQL, MIN()
funktion är en aggregerad funktion som returnerar minimivärdet i ett givet uttryck.
Nedan följer några grundläggande exempel för att visa hur det fungerar.
Exempeltabell
Anta att vi har följande tabell:
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. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Exempel
Här är ett enkelt exempel att visa.
SELECT MIN(ProductPrice)
FROM Products;
Resultat:
+--------------------+ | (No column name) | |--------------------| | 9.99 | +--------------------+
I det här fallet lagras prisinformation i ProductPrice
kolumnen, och så skickar vi det som ett argument till MIN()
funktion, som sedan beräknar och returnerar resultatet.
Använda kolumnalias
Du kommer att märka att de tidigare resultaten inte innehåller ett kolumnnamn. Detta är förväntat eftersom MIN()
funktion returnerar inga kolumner. Du kan enkelt ange ett kolumnnamn genom att tilldela ett alias.
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Resultat:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Filtrerade resultat
MIN()
funktionen fungerar på raderna som returneras av frågan. Så om du filtrerar resultaten blir resultatet av MIN()
kommer att återspegla det.
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products
WHERE VendorId = 1001;
Resultat:
+----------------+ | MinimumPrice | |----------------| | 11.99 | +----------------+
I det här fallet är 11,99 minimipriset av alla produkter som erbjuds av den angivna leverantören.
NULL
Värden
MIN()
funktionen ignorerar någon NULL
värden. I vår exempeltabell ovan, produktnummer 6
har NULL
i dess ProductPrice
kolumn, men det ignorerades i vår MIN()
exempel.
Beroende på ditt DBMS och dina inställningar kanske du ser en varning som NULL
värden eliminerades i resultatuppsättningen.
Här är ett exempel på vad du kan se:
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Resultat:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Allt detta säger oss är att kolumnen innehöll minst en NULL
värde, och att det ignorerades vid beräkning av resultaten.
Datum/tiddata
Du kan använda MIN()
på datum/tidsvärden.
Anta att vi har följande tabell:
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 använda MIN()
för att hitta det lägsta födelsedatumet (DOB
).
SELECT MIN(DOB) AS MinDOB
FROM Pets;
Resultat:
+------------+ | MinDOB | |------------| | 2018-10-01 | +------------+
Återigen ignorerar den NULL
värden.
Teckendata
När den används med teckendatakolumner, MIN()
hittar det värde som är lägst i sorteringssekvensen.
Exempel:
SELECT MIN(ProductName) AS MinimumProductName
FROM Products;
Resultat:
+---------------------------------+ | MinimumProductName | |---------------------------------| | Bottomless Coffee Mugs (4 Pack) | +---------------------------------+
DISTINCT
Nyckelord
Din DBMS kan tillåta DISTINCT
nyckelord som ska användas med MIN()
fungera. Om så är fallet är detta förmodligen för att uppfylla ISO SQL-standarden.
Därför kanske du kan göra detta:
SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;
Resultat:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Men det kommer inte att påverka resultaten.
DISTINCT
Nyckelordet kan vara mycket användbart när det används med andra sammanhang (t.ex. med COUNT()
funktion), men den har ingen betydelse när den används med MIN()
. DISTINCT
nyckelordet tar bort dubbletter, men i fallet med MIN()
det kommer inte att göra någon skillnad eftersom MIN()
returnerar samma resultat oavsett hur många rader som delar samma minimivärde.
Fönsterfunktioner
Beroende på ditt DBMS kan du kanske använda en OVER
sats med din MIN()
funktion för att skapa en fönsterfunktion.
En fönsterfunktion utför en aggregatliknande operation på en uppsättning frågerader. Det ger ett resultat för varje frågerad. Detta till skillnad från en aggregerad operation, som grupperar frågerader i en enda resultatrad.
Här är ett exempel för att demonstrera konceptet.
Vi har redan sett Products
tabell. Vår databas har också en Customers
tabell och den innehåller följande 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 hämta data från dessa tabeller och presentera dem som en resultatuppsättning genom att använda en join.
Vi kan också använda MIN()
funktion med OVER
sats för att tillämpa en fönsterfunktion på data.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MIN(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Minimum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Minimum Price For This Vendor";
Resultat:
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Minimum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 11.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 11.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 11.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 det här fallet använde vi OVER
sats med vår MIN()
funktion för att partitionera resultatet efter leverantörsnamn.
Genom att göra detta kunde vi returnera prisinformation för varje produkt, såväl som minimipriset för alla produkter från den givna leverantören. Detta minimipris ändras när leverantören ändras (såvida inte flera leverantörer råkar ha samma minimipris), men förblir detsamma för alla produkter från samma leverantör.
Det här konceptet kan också tillämpas på andra aggregerade funktioner i SQL, såsom SUM()
, AVG()
, MAX()
och COUNT()
.