V SQL, MIN()
funkce je agregační funkce, která vrací minimální hodnotu v daném výrazu.
Níže je uvedeno několik základních příkladů, které demonstrují, jak to funguje.
Ukázková tabulka
Předpokládejme, že máme následující tabulku:
SELECT * FROM Products;
Výsledek:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | 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. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Příklad
Zde je jednoduchý příklad k demonstraci.
SELECT MIN(ProductPrice)
FROM Products;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | 9.99 | +--------------------+
V tomto případě jsou informace o ceně uloženy v ProductPrice
a tak to předáme jako argument do MIN()
funkce, která pak vypočítá a vrátí výsledek.
Použití aliasů sloupců
Všimnete si, že předchozí výsledky neobsahují název sloupce. To se dá očekávat, protože MIN()
funkce nevrací žádné sloupce. Název sloupce můžete snadno zadat přiřazením aliasu.
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Výsledek:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Filtrované výsledky
MIN()
funkce pracuje na řádcích vrácených dotazem. Pokud tedy filtrujete výsledky, výsledek MIN()
to bude odrážet.
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products
WHERE VendorId = 1001;
Výsledek:
+----------------+ | MinimumPrice | |----------------| | 11.99 | +----------------+
V tomto případě je 11,99 minimální cena ze všech produktů nabízených uvedeným prodejcem.
NULL
Hodnoty
MIN()
funkce ignoruje všechny NULL
hodnoty. V naší vzorové tabulce výše číslo produktu 6
má NULL
v jeho ProductPrice
sloupec, ale to bylo ignorováno v našem MIN()
příklad.
V závislosti na vašem DBMS a vašem nastavení se může nebo nemusí zobrazit varování, že NULL
hodnoty byly ze sady výsledků vyloučeny.
Zde je příklad toho, co můžete vidět:
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Výsledek:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
To vše nám říká, že sloupec obsahoval alespoň jeden NULL
hodnotu a že byla při výpočtu výsledků ignorována.
Datum/čas
Můžete použít MIN()
na hodnotách data/času.
Předpokládejme, že máme následující tabulku:
SELECT PetName, DOB
FROM Pets;
Výsledek:
+-----------+------------+ | 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 | +-----------+------------+
Můžeme použít MIN()
najít minimální datum narození (DOB
).
SELECT MIN(DOB) AS MinDOB
FROM Pets;
Výsledek:
+------------+ | MinDOB | |------------| | 2018-10-01 | +------------+
Opět ignoruje NULL
hodnoty.
Údaje o postavách
Při použití se sloupci znakových dat MIN()
najde hodnotu, která je v třídicí posloupnosti nejnižší.
Příklad:
SELECT MIN(ProductName) AS MinimumProductName
FROM Products;
Výsledek:
+---------------------------------+ | MinimumProductName | |---------------------------------| | Bottomless Coffee Mugs (4 Pack) | +---------------------------------+
DISTINCT
Klíčové slovo
Váš DBMS může povolit DISTINCT
klíčové slovo, které se má použít s MIN()
funkce. Pokud ano, je to pravděpodobně kvůli dodržení standardu ISO SQL.
Proto může být možné provést toto:
SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;
Výsledek:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Ale nebude to mít žádný vliv na výsledky.
DISTINCT
klíčové slovo může být velmi užitečné při použití v jiných kontextech (např. s COUNT()
funkce), ale při použití s MIN()
nemá žádný význam . DISTINCT
klíčové slovo odstraní duplikáty, ale v případě MIN()
nebude to dělat žádný rozdíl, protože MIN()
vrátí stejný výsledek bez ohledu na to, kolik řádků sdílí stejnou minimální hodnotu.
Funkce okna
V závislosti na vašem DBMS možná budete moci použít OVER
klauzule s vaším MIN()
funkce pro vytvoření funkce okna.
Funkce okna provádí operaci podobnou agregaci na sadě řádků dotazu. Vytváří výsledek pro každý řádek dotazu. To je na rozdíl od agregované operace, která seskupuje řádky dotazu do jednoho řádku výsledku.
Zde je příklad pro demonstraci konceptu.
Již jsme viděli Products
stůl. Naše databáze má také Customers
tabulka a obsahuje následující údaje:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 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 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
Můžeme načíst data z těchto tabulek a prezentovat je jako jednu sadu výsledků pomocí spojení.
Můžeme také použít MIN()
funkce s OVER
klauzule k aplikaci funkce okna na 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";
Výsledek:
+---------------+---------------------------------+----------------+---------------------------------+ | 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 | +---------------+---------------------------------+----------------+---------------------------------+
V tomto případě jsme použili OVER
klauzule s naším MIN()
funkce k rozdělení výsledku podle názvu dodavatele.
Díky tomu jsme byli schopni vrátit informace o ceně pro každý produkt a také minimální cenu pro všechny produkty od daného dodavatele. Tato minimální cena se mění se změnou dodavatele (pokud náhodou nemá více dodavatelů stejnou minimální cenu), ale zůstává stejná pro všechny produkty od stejného dodavatele.
Tento koncept lze také aplikovat na další agregační funkce v SQL, jako je SUM()
, AVG()
, MAX()
a COUNT()
.