O MySQL
MIN()
function é uma função agregada que retorna o valor mínimo de uma expressão. Normalmente, a expressão seria um intervalo de valores retornados como linhas separadas em uma coluna, e você pode usar essa função para localizar o valor mínimo das linhas retornadas. Se não houver linhas correspondentes,
MIN()
retorna NULL
. Por exemplo, você pode usar esta função para descobrir qual cidade tem a menor população de uma lista de cidades.
Sintaxe
A sintaxe de
MIN()
fica assim:MIN([DISTINCT] expr) [over_clause]
Onde
expr
é a expressão para a qual você deseja o valor mínimo. A
over_clause
é uma cláusula opcional que funciona com funções de janela. Observe que a over_clause
só pode ser usado se você não usar o DISTINCT
palavra-chave. O (opcional)
DISTINCT
palavra-chave pode ser usada para eliminar valores duplicados. Exemplo básico
Primeiro, aqui estão os dados brutos que usaremos neste exemplo:
USE world; SELECT Name, Population FROM City WHERE CountryCode = 'THA';
Resultado:
+-------------------+------------+ | 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 | +-------------------+------------+
Podemos usar o
MIN()
função para encontrar a cidade com a menor população (ou seja, a linha com o menor valor em sua coluna de população). USE world; SELECT MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'THA';
Resultado:
+---------------+ | Minimum Value | +---------------+ | 94100 | +---------------+
A Cláusula GROUP BY
Podemos usar o
GROUP BY
cláusula para listar cada distrito, juntamente com a população da menor cidade desse distrito (por população):USE world; SELECT District, MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Resultado:
+-----------------+---------------+ | District | Minimum Value | +-----------------+---------------+ | New South Wales | 219761 | | Victoria | 125382 | | Queensland | 92273 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+---------------+
A Cláusula ORDER BY
Também podemos usar o
ORDER BY
cláusula para especificar uma coluna com a qual ordenar por:USE world; SELECT District, MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Minimum Value` ASC;
Resultado:
+-----------------+---------------+ | District | Minimum Value | +-----------------+---------------+ | Queensland | 92273 | | Victoria | 125382 | | Tasmania | 126118 | | New South Wales | 219761 | | Capital Region | 322723 | | South Australia | 978100 | | West Australia | 1096829 | +-----------------+---------------+
Isso ordena os resultados em ordem crescente, que lista primeiro o valor mínimo.
Observe que, ao ordenar por um alias de várias palavras (como
`Minimum Value`
), você precisa usar o caractere de acento grave (`
) em vez do apóstrofo ('
) para cercar as duas palavras. Encontre o comprimento mínimo de caracteres
O
MIN()
A função não se limita apenas a colunas com dados numéricos. Você também pode combinar MIN()
com outras funções para retornar valores mínimos em outras áreas. Por exemplo, usando nossos dados de exemplo, podemos encontrar o valor com o número mínimo de caracteres na
City
coluna:SELECT MIN(CHAR_LENGTH(Name)) AS 'Minimum Character Length' FROM city;
Resultado:
+--------------------------+ | Minimum Character Length | +--------------------------+ | 3 | +--------------------------+
Também podemos ver isso usando a seguinte consulta (que não envolve o
MIN()
função):SELECT Name, CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` LIMIT 10;
Resultado:
+------+------------------+ | Name | Character Length | +------+------------------+ | Ome | 3 | | Yao | 3 | | Qom | 3 | | Itu | 3 | | Tsu | 3 | | Ube | 3 | | Ise | 3 | | Uji | 3 | | Ede | 3 | | Ota | 3 | +------+------------------+
Visto que várias cidades têm o mesmo comprimento de caracteres, podemos ajustar esta consulta para retornar apenas os valores distintos:
SELECT DISTINCT CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` LIMIT 10;
Resultado:
+------------------+ | Character Length | +------------------+ | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 11 | | 12 | +------------------+
Usando uma cláusula OVER
Como mencionado, a sintaxe permite um
OVER
cláusula a ser incluída em suas consultas. Basicamente, o OVER
A cláusula permite especificar como particionar linhas de consulta em grupos para processamento pela função de janela. Aqui está um exemplo:
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;
Resultado:
+-----------------+---------------+-----------------+------------------+ | 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 | +-----------------+---------------+-----------------+------------------+
Este exemplo particiona as linhas por
District
, fornecendo o valor mínimo para cada partição (distrito). Isso permite que você veja dados mais granulares, como a população de cada cidade, juntamente com a população da menor cidade (por população) no mesmo distrito.