sql >> Databáze >  >> RDS >> Mysql

MIN() – Najděte minimální hodnotu ve sloupci v MySQL

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.


  1. Mohu použít návratovou hodnotu INSERT...RETURNING v jiném INSERTu?

  2. Nelze se připojit k místnímu PostgreSQL

  3. Testování výkonu pomocí MySQLdump a MySQL Shell Utility

  4. Omezení optimalizátoru s filtrovanými indexy