Volver a la lista de artículos Artículos
Lectura de 9 minutos

Explicación de las funciones MIN y MAX de SQL en 6 ejemplos

¿Qué son las funciones SQL MIN() y MAX()? ¿Cuándo se deben usar como funciones agregadas y cuándo se deben usar con funciones de ventana? Lo explicamos con ejemplos prácticos.

Es difícil imaginar SQL sin las funciones de agregación MIN() y MAX(). Son muy útiles entre muchos profesionales de los datos porque nos permiten resolver muchos problemas empresariales. En este artículo, explicaré lo que hace cada función y discutiré varios casos de uso.

Comencemos.

¿Qué es la función MIN() en SQL?

El estándar SQL es soportado por la mayoría de los motores de bases de datos relacionales e incluye varias funciones de agregación. Estas funciones de agregación realizan cálculos sobre datos numéricos. Una Guía para principiantes de las funciones agregadas de SQL las discute todas en detalle; este artículo se centra en sólo dos de estas funciones: MIN() y MAX().

En primer lugar, hablemos de la función MIN(). Devuelve el valor más pequeño de un conjunto de valores. Los valores pueden proceder de una columna numérica o ser el resultado de una expresión que devuelva un valor numérico. (Nota: La columna puede provenir de una tabla o de una vista.) Es una función escalar que devuelve un valor numérico.

La sintaxis de la función MIN() se presenta a continuación:

MIN(column_or_expression)

Como ve, esta función toma un argumento - una columna o una expresión con valores numéricos. Es importante que los valores sean numéricos, porque la función encuentra el valor mínimo entre ellos. Por ejemplo, de este conjunto de valores ...

4, 5, 8, 2, 14

... MIN() devuelve 2.

¿Qué es la función MAX() en SQL?

Al igual que MIN(), MAX() es una función agregada que devuelve un valor numérico de un conjunto. La diferencia es que devuelve el mayor valor (máximo). Los valores pueden provenir de una columna o como resultado de una expresión que devuelva un valor o valores numéricos. Es una función escalar que devuelve un valor.

Esta es la sintaxis de la función MAX():

MAX(column_or_expression)

De este conjunto de valores ...

4, 5, 8, 2, 14 

... MAX() devuelve 14.

Los datos de la muestra

Antes de comenzar a analizar los casos de uso de MIN() y MAX(), veamos los datos que utilizaremos en la tabla cosmetics:

idnamecategorydelivered_yearprice
1shampoohair202011
2night creamface202012
3cleanserface20205
4brushhair20203
5mascaraeye20218
6eyebroweye202115
7conditionerhair202121
8sprayhair202113
9eyelinereye202120
10tonicface202021
11face maskface202110
12eye creameye202122
13hair maskhair20203

Esta tabla almacena información sobre productos cosméticos en tres categorías (la columna category): pelo, cara y ojos. Los nombres de los productos están en la columna nombre. Las dos últimas columnas presentan datos sobre cuándo se entregó el producto (delivered_year) y su price. Sólo hay dos años (2020 y 2021) en la columna delivered_year.

Si necesita ayuda con las sentencias y funciones SQL que utilizamos en este artículo, pruebe la hoja de trucos deSQL para principiantes .

Ejemplos de casos de uso de MIN() y MAX()

1. Uso de MIN() o MAX() como columna única

Las funciones agregadas como MIN() pueden utilizarse como una sola columna en la consulta SELECT. Por ejemplo:

SELECT MIN(price) FROM cosmetics;

Este es el resultado:

min
3

Después de la palabra clave SELECT, ponemos MIN() y el nombre de la columna (en este caso, price). A continuación, la palabra clave FROM y el nombre de la tabla (cosmetics). El resultado es el valor más pequeño de la columna price, que es 3.

Puede utilizar MAX() exactamente de la misma manera para encontrar el precio más alto del producto:

SELECT MAX(price) FROM cosmetics;

Y aquí está el resultado:

max
22

El precio máximo de la tabla cosmetics es 22 (el precio de la crema de ojos).

El artículo Cómo encontrar los valores mínimos en las columnas le ofrece más ejemplos sobre cómo encontrar el valor mínimo.

2. Uso de MIN() y MAX() con otras columnas

Un uso más avanzado de las funciones MIN() o MAX() es utilizarlas en grupos de filas. A continuación se muestra otra consulta:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Devuelve los datos:

categorymax_price
hair21
face21
eye22

Primero está la palabra clave SELECT con el nombre de la columna (category), luego la función MAX() con la columna price como argumento. Luego tenemos max_price, el alias de la nueva columna creada por MAX().

A continuación tenemos la palabra clave FROM y el nombre de la tabla. Al final, tenemos la cláusula GROUP BY con la columna category. Esto determina los grupos (es decir, los productos se agrupan por categoría). Para cada grupo, obtenemos su mayor valor, en este caso, el precio más alto entre los productos de esa categoría. En la categoría "ojos", el precio más alto es de 22 dólares; en las categorías "cara" y "pelo", es de 21 dólares.

El artículo Cómo encontrar los valores máximos en las filas te da más ejemplos de esta función.

3. Uso de MIN() y MAX() en la misma consulta

Puede utilizar las funciones MIN y MAX en una misma consulta SELECT. Si sólo utiliza estas funciones sin ninguna columna, no necesita una cláusula GROUP BY.

A continuación tenemos una consulta que implementa ambas funciones:

 SELECT MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics;

Esta consulta devuelve los datos:

min_pricemax_price
322

En el SELECT, tenemos la función MIN() con el argumento de la columna price seguida de MAX() con el mismo argumento y sus respectivos alias. Esto devuelve el precio mínimo ($3) y el precio máximo ($22) de todos los productos de la tabla.

Por supuesto, puede hacer lo mismo calculando el precio mínimo y máximo de cada categoría. Sin embargo, aquí tendrá que utilizar el método GROUP BY:

SELECT category,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Este es el conjunto de resultados:

categorymin_pricemax_price
hair321
face521
eye822

En este caso, el precio mínimo en la categoría "pelo" es de 3$ y el máximo de 21$, mientras que en la categoría "ojos" el valor más bajo es de 8$ y el más alto de 22$.

Puedes aprender más sobre cómo encontrar valores mínimos y máximos en los artículos Cómo encontrar el valor mínimo de una columna en SQL y Cómo encontrar el valor máximo de una columna numérica en SQL.

4. Uso de MIN() o MAX() en la cláusula HAVING

Otra forma de utilizar MIN() o MAX() es filtrando las filas según el valor devuelto por esta función, es decir, en la cláusula HAVING.

La siguiente consulta implementa MIN() en HAVING:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category
HAVING MIN(price)>4;

El conjunto de resultados:

categorymax_price
face21
eye22

En el SELECT, tenemos la columna category. A continuación, la función MAX() con price como argumento. Para cada categoría, calcularemos el precio máximo entre los productos que pertenecen a esa categoría. Después FROM cosmetics viene la cláusula GROUP BY con la columna category.

Al final de la consulta se encuentra la cláusula HAVING con la función MIN(). De este modo, se encontrará el precio más bajo entre los productos de cada categoría; si ese precio es inferior a 4, no se incluirá en los resultados. Como el precio mínimo en la categoría "pelo" es de 3 dólares, no se ha mostrado en el conjunto de resultados.

Observe que el uso de cualquiera de las dos funciones en HAVING no requiere su uso (ni el de ninguna función agregada) en SELECT.

5. Uso de MIN() o MAX() en una función de ventana simple

El uso más avanzado de MIN() o MAX() es en una función ventana. Si no está familiarizado con las funciones ventana, lea el artículo Ejemplos de funciones ventana SQL con explicaciones.

Aquí hay una función de ventana simple que usa la función MIN():

SELECT name, price, category, delivered_year,
  MIN(price) OVER (ORDER BY category DESC) AS min_price
FROM cosmetics;

Lo primero que puede notar es la lista de columnas SELECT: name, price, category, delivered_year. Lo siguiente es la función agregada MIN(price), que encuentra el valor más bajo en la columna price. OVER es lo que hace que esta sea una función ventana; define la ventana. o el conjunto de filas dentro del conjunto de resultados de la consulta. Esto nos permite calcular un valor agregado para cada fila de la ventana. Aquí, OVER está emparejado con ORDER BY categoría DESC (es decir, en orden descendente); por lo tanto, el precio mínimo es siempre de 3 dólares, porque el precio más bajo en la categoría "pelo" es de 3 dólares, que es más bajo que el mínimo de la categoría siguiente de 5 dólares.

Este es el resultado:

namepricecategorydelivered_yearmin_price
hair mask3hair20203
brush3hair20203
conditioner21hair20213
spray13hair20213
shampoo11hair20203
night cream12face20203
cleanser5face20203
tonic21face20203
face mask10face20213
mascara8eye20213
eye cream22eye20213
eyeliner20eye20213
eyebrow15eye20213

6. Uso de MIN/MAX en una función de ventana dividida

A continuación, usemos MIN() o MAX() en una función de ventana que tenga la cláusula PARTITION BY. (Si necesita un repaso de PARTITION BY, eche un vistazo a la hoja de trucos de SQL Funciones de ventana .) Esta es la consulta:

SELECT name, price, category, delivered_year,
  MIN(price) OVER (PARTITION BY delivered_year
           	ORDER BY category DESC)
  AS min_price
FROM cosmetics;

Esta consulta calcula el precio mínimo de cada partición basándose en la columna delivered_year y ordena las filas por la categoría.

Devuelve el siguiente conjunto de resultados:

namepricecategorydelivered_yearmin_price
shampoo11hair20203
brush3hair20203
hair mask3hair20203
tonic21face20203
night cream12face20203
cleanser5face20203
spray13hair202113
conditioner21hair202113
face mask10face202110
eyeliner20eye20218
mascara8eye20218
eyebrow15eye20218
eye cream22eye20218

Estos resultados contienen la lista de cosméticos, incluyendo su nombre, precio, categoría y el año de entrega. Cada fila contiene también el precio mínimo para ese año de entrega (que es la partición). En cada partición, las filas se ordenan de forma descendente por categoría.

En este caso, la cláusula OVER contiene las cláusulas ORDER BY y PARTITION BY. PARTITION BY delivered_year indica que el precio mínimo se calcula por separado para cada año. Los registros de cada partición (el año en que se entregaron los productos) se ordenan según la categoría en orden descendente (ORDER BY categoría DESC).

Lo que hemos aprendido sobre las funciones MIN() y MAX() de SQL

Las funciones agregadas de SQL MIN() y MAX() son muy populares. En este artículo, he explicado cómo utilizarlas en varios casos. La principal diferencia entre ellas es que MIN() encuentra el valor mínimo en un conjunto de valores, mientras que MAX() devuelve el valor máximo.

Ahora que sabes cómo usar MIN() y MAX(), estás listo para

  • Encontrar los valores mayores/menores entre todas las filas dadas o grupos de filas dadas.
  • Comparar los valores mínimos y máximos con otras filas.
  • Utilizar estas funciones en particiones y en funciones de ventana simples.

Para más información sobre las diferencias entre los valores agregados y las funciones ventana, pruebe nuestro artículo SQL Funciones de ventana vs. Funciones Agregadas SQL: Similitudes y diferencias.

Si eres un principiante y quieres ampliar tus conocimientos de SQL, te recomiendo el curso de LearnSQL.es SQL para principiantes de la empresa. Pero si ya estás familiarizado con el SQL básico, tal vez quieras tomar nuestro Funciones de ventana curso para mejorar tus conocimientos.