El MySQL MIN()
La función es una función agregada que devuelve el valor mínimo de una expresión.
Normalmente, la expresión sería un rango de valores devueltos como filas separadas en una columna, y puede usar esta función para encontrar el valor mínimo de las filas devueltas. Si no hay filas coincidentes, MIN()
devuelve NULL
.
Por ejemplo, puede usar esta función para averiguar qué ciudad tiene la menor población de una lista de ciudades.
Sintaxis
La sintaxis de MIN()
va así:
MIN([DISTINCT] expr) [over_clause]
Donde expr
es la expresión para la que desea el valor mínimo.
La over_clause
es una cláusula opcional que funciona con funciones de ventana. Tenga en cuenta que la over_clause
solo se puede usar si no usa el DISTINCT
palabra clave.
El (opcional) DISTINCT
La palabra clave se puede utilizar para eliminar valores duplicados.
Ejemplo básico
Primero, aquí están los datos sin procesar que usaremos en este ejemplo:
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 el MIN()
función para encontrar la ciudad con la población más pequeña (es decir, la fila con el valor más pequeño en su columna de población).
USE world; SELECT MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'THA';
Resultado:
+---------------+ | Minimum Value | +---------------+ | 94100 | +---------------+
La cláusula GROUP BY
Podemos usar el GROUP BY
cláusula para enumerar cada distrito, junto con la población de la ciudad más pequeña de ese distrito (por población):
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 | +-----------------+---------------+
La cláusula ORDEN POR
También podemos usar el ORDER BY
cláusula para especificar una columna con la que 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 | +-----------------+---------------+
Esto ordena los resultados en orden ascendente, que enumera el valor mínimo primero.
Tenga en cuenta que, al ordenar por un alias de varias palabras (como `Minimum Value`
), debe usar el carácter de acento grave (`
) en lugar del apóstrofe ('
) para rodear las dos palabras.
Encuentre la longitud mínima de caracteres
El MIN()
La función no se limita solo a columnas con datos numéricos. También puede combinar MIN()
con otras funciones para devolver valores mínimos en otras áreas.
Por ejemplo, usando nuestros datos de muestra, podemos encontrar el valor con la cantidad mínima de caracteres en la City
columna:
SELECT MIN(CHAR_LENGTH(Name)) AS 'Minimum Character Length' FROM city;
Resultado:
+--------------------------+ | Minimum Character Length | +--------------------------+ | 3 | +--------------------------+
También podemos ver esto usando la siguiente consulta (que no involucra el MIN()
función):
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 | +------+------------------+
Dado que varias ciudades tienen la misma longitud de caracteres, podemos ajustar esta consulta para que devuelva solo los 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 | +------------------+
Uso de una cláusula OVER
Como se mencionó, la sintaxis permite un OVER
cláusula a incluir en sus consultas. Básicamente, el OVER
La cláusula le permite especificar cómo dividir las filas de consulta en grupos para que la función de ventana las procese.
He aquí un ejemplo:
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 ejemplo divide las filas por District
, proporcionando el valor mínimo para cada partición (distrito). Esto le permite ver datos más granulares, como la población de cada ciudad, junto con la población de la ciudad más pequeña (por población) en el mismo distrito.