MySQL MIN()
funkce je agregační funkce, která vrací minimální hodnotu z výrazu.
Typicky by výraz byl rozsah hodnot vrácených jako samostatné řádky ve sloupci a tuto funkci můžete použít k nalezení minimální hodnoty z vrácených řádků. Pokud neexistují žádné odpovídající řádky, MIN()
vrátí NULL
.
Tuto funkci můžete použít například ke zjištění, které město má nejmenší počet obyvatel ze seznamu měst.
Syntaxe
Syntaxe MIN()
vypadá takto:
MIN([DISTINCT] expr) [over_clause]
Kde expr
je výraz, pro který chcete minimální hodnotu.
over_clause
je volitelná klauzule, která pracuje s funkcemi okna. Všimněte si, že over_clause
lze použít pouze v případě, že nepoužíváte DISTINCT
klíčové slovo.
(volitelný) DISTINCT
klíčové slovo lze použít k odstranění duplicitních hodnot.
Základní příklad
Nejprve jsou zde nezpracovaná data, která použijeme v tomto příkladu:
USE world; SELECT Name, Population FROM City WHERE CountryCode = 'THA';
Výsledek:
+-------------------+------------+ | 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 | +-------------------+------------+
Můžeme použít MIN()
funkce k nalezení města s nejmenším počtem obyvatel (tj. řádek s nejmenší hodnotou ve sloupci populace).
USE world; SELECT MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'THA';
Výsledek:
+---------------+ | Minimum Value | +---------------+ | 94100 | +---------------+
Klauzule GROUP BY
Můžeme použít GROUP BY
klauzule k uvedení každého okresu spolu s počtem obyvatel nejmenšího města tohoto okresu (podle počtu obyvatel):
USE world; SELECT District, MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Výsledek:
+-----------------+---------------+ | District | Minimum Value | +-----------------+---------------+ | New South Wales | 219761 | | Victoria | 125382 | | Queensland | 92273 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+---------------+
Ustanovení ORDER BY
Můžeme také použít ORDER BY
klauzule k určení sloupce, se kterým se má seřadit podle:
USE world; SELECT District, MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Minimum Value` ASC;
Výsledek:
+-----------------+---------------+ | District | Minimum Value | +-----------------+---------------+ | Queensland | 92273 | | Victoria | 125382 | | Tasmania | 126118 | | New South Wales | 219761 | | Capital Region | 322723 | | South Australia | 978100 | | West Australia | 1096829 | +-----------------+---------------+
To seřadí výsledky vzestupně, přičemž jako první je uvedena minimální hodnota.
Pamatujte, že při objednávání pomocí víceslovného aliasu (např. `Minimum Value`
), musíte použít znak zpětného zaškrtnutí (`
) namísto apostrofu ('
) k ohraničení dvou slov.
Najděte minimální délku znaků
MIN()
funkce není omezena pouze na sloupce s číselnými údaji. Můžete také kombinovat MIN()
s dalšími funkcemi pro návrat minimálních hodnot v jiných oblastech.
Například pomocí našich ukázkových dat můžeme najít hodnotu s minimálním počtem znaků v City
sloupec:
SELECT MIN(CHAR_LENGTH(Name)) AS 'Minimum Character Length' FROM city;
Výsledek:
+--------------------------+ | Minimum Character Length | +--------------------------+ | 3 | +--------------------------+
Můžeme to vidět také pomocí následujícího dotazu (který nezahrnuje MIN()
funkce):
SELECT Name, CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` LIMIT 10;
Výsledek:
+------+------------------+ | Name | Character Length | +------+------------------+ | Ome | 3 | | Yao | 3 | | Qom | 3 | | Itu | 3 | | Tsu | 3 | | Ube | 3 | | Ise | 3 | | Uji | 3 | | Ede | 3 | | Ota | 3 | +------+------------------+
Vzhledem k tomu, že několik měst má stejnou délku znaků, můžeme tento dotaz upravit tak, aby vracel pouze odlišné hodnoty:
SELECT DISTINCT CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` LIMIT 10;
Výsledek:
+------------------+ | Character Length | +------------------+ | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 11 | | 12 | +------------------+
Použití klauzule OVER
Jak již bylo zmíněno, syntaxe umožňuje OVER
klauzule, která má být zahrnuta do vašich dotazů. V podstatě OVER
klauzule umožňuje určit, jak rozdělit řádky dotazu do skupin pro zpracování funkcí okna.
Zde je příklad:
SELECT District, Name AS City, Population AS 'City Population', MIN(Population) OVER(PARTITION BY District) AS 'District Minimum' FROM City WHERE CountryCode = 'AUS' ORDER BY `District Minimum` DESC;
Výsledek:
+-----------------+---------------+-----------------+------------------+ | District | City | City Population | District Minimum | +-----------------+---------------+-----------------+------------------+ | West Australia | Perth | 1096829 | 1096829 | | South Australia | Adelaide | 978100 | 978100 | | Capital Region | Canberra | 322723 | 322723 | | New South Wales | Sydney | 3276207 | 219761 | | New South Wales | Wollongong | 219761 | 219761 | | New South Wales | Newcastle | 270324 | 219761 | | New South Wales | Central Coast | 227657 | 219761 | | Tasmania | Hobart | 126118 | 126118 | | Victoria | Melbourne | 2865329 | 125382 | | Victoria | Geelong | 125382 | 125382 | | Queensland | Townsville | 109914 | 92273 | | Queensland | Brisbane | 1291117 | 92273 | | Queensland | Cairns | 92273 | 92273 | | Queensland | Gold Coast | 311932 | 92273 | +-----------------+---------------+-----------------+------------------+
Tento příklad rozděluje řádky podle District
, poskytující minimální hodnotu pro každý oddíl (okres). To vám umožní zobrazit podrobnější údaje, jako je počet obyvatel každého města spolu s počtem obyvatel nejmenšího města (podle počtu obyvatel) ve stejném okrese.