Función SQL · comparar expresiones

LEAST y GREATEST en SQL: elegir el menor o mayor valor

LEAST y GREATEST comparan varias expresiones de una misma fila y devuelven el menor o el mayor valor. Son útiles para límites, fechas y comparaciones columna a columna, pero su disponibilidad y tratamiento de NULL cambian entre motores.

Lectura: 5–7 minDiferencias por motorPráctica con pistas
Contenido de esta guía

Qué hacen

LEAST(a, b, c) devuelve el menor de sus argumentos y GREATEST(a, b, c) devuelve el mayor. A diferencia de MIN() y MAX() como agregaciones, comparan expresiones dentro de una misma fila en lugar de resumir varias filas.

Ejemplo: limitar un valor a un máximo

Imagina que una promoción no puede aplicar más de 30 euros de descuento aunque el cálculo bruto sea mayor.

PostgreSQL / MySQL / SQL Server 2022+
WITH ofertas(nombre, descuento_calculado) AS (
  VALUES ('A', 12), ('B', 35), ('C', 27)
)
SELECT
  nombre,
  LEAST(descuento_calculado, 30) AS descuento_aplicado
FROM ofertas
ORDER BY nombre;
Resultado lógico esperado
nombredescuento_aplicado
A12
B30
C27

SQLite usa min() y max() con varios argumentos

SQLite no expone LEAST/GREATEST con esos nombres. Sus funciones escalares min(X,Y,...) y max(X,Y,...) cumplen el papel equivalente cuando reciben dos o más argumentos.

Equivalente ejecutado en SQLite 3.46.1
WITH ofertas(nombre, descuento_calculado) AS (
  VALUES ('A', 12), ('B', 35), ('C', 27)
)
SELECT
  nombre,
  min(descuento_calculado, 30) AS descuento_aplicado
FROM ofertas
ORDER BY nombre;

La diferencia importante: NULL

No copies la intuición de un motor a otro. PostgreSQL y SQL Server documentan que LEAST/GREATEST ignoran argumentos NULL cuando existe al menos un valor no nulo. MySQL documenta que GREATEST() devuelve NULL si cualquier argumento es NULL; SQLite también hace que su max(X,Y,...) multargumento devuelva NULL si algún argumento es nulo.

Consecuencia: GREATEST(10, NULL, 20) no es portable como expresión semánticamente idéntica. Si el tratamiento de nulos importa, normalízalos de forma explícita con CASE o COALESCE según la pregunta real.

Los tipos también importan

Los argumentos deben poder compararse bajo las reglas del motor. Mezclar texto y números puede activar conversiones implícitas o producir un error. Para una consulta mantenible, procura comparar valores del mismo dominio y usa CAST cuando la conversión sea deliberada.

Cuándo usar LEAST/GREATEST y cuándo MIN/MAX

PreguntaHerramienta
¿Cuál de estas tres columnas es la fecha más reciente de esta fila?GREATEST(col1, col2, col3)
¿Cuál es el precio más alto entre todas las filas?MAX(precio)
¿Quiero imponer un límite superior por fila?LEAST(valor, limite)
¿Quiero resumir un grupo?MIN() / MAX() agregados

Práctica: acota una puntuación

Básica · expresiones

Mantén la puntuación entre 0 y 100

En motores con LEAST/GREATEST, limita cada valor primero a un mínimo de 0 y luego a un máximo de 100.

Qué debes recordar

  • LEAST y GREATEST comparan varias expresiones de una fila.
  • No son lo mismo que MIN/MAX agregados.
  • SQLite utiliza min()/max() escalares con varios argumentos.
  • El tratamiento de NULL difiere entre motores; no lo presupongas.
  • Mantén tipos comparables y convierte de forma explícita cuando sea necesario.

Conceptos relacionados

Fuentes técnicas consultadas