Funciones matemáticas básicas en SQL
Lección 3.3 · Tiempo de lectura: ~8 min · Tareas de práctica ↓
En esta lección conocerás las funciones matemáticas básicas de SQL, que permiten calcular y transformar datos numéricos directamente en las consultas. Veremos el redondeo, el módulo, las potencias, las raíces y la comparación de valores, con ejemplos prácticos de Sakila. Al terminar, podrás aplicar estas funciones con seguridad en tareas analíticas y prácticas.
Las funciones matemáticas de SQL sirven para hacer cálculos con datos numéricos. Permiten redondear valores, encontrar mínimos y máximos, calcular restos de divisiones y mucho más. Esta lección presenta las funciones matemáticas más usadas, con ejemplos basados en la base de datos Sakila.
Importante: los datos numéricos en SQL pueden tener distintos tipos (INTEGER, REAL/FLOAT, DECIMAL/NUMERIC). Una misma fórmula puede dar resultados distintos según el tipo de datos (por ejemplo, por la división entera, el redondeo y la precisión). Si no se tienen en cuenta los tipos, el resultado final puede no ser el esperado.
Funciones matemáticas habituales
ABS(): devuelve el valor absoluto de un número.
Sintaxis:
ABS(number)
Ejemplo:
SELECT ABS(amount - 5) AS abs_difference
FROM payment
LIMIT 3;
Resultado: devuelve la diferencia absoluta entre amount y 5.
CEIL() / CEILING(): redondea un número hacia arriba (al entero más cercano).
Sintaxis:
CEIL(number)
CEILING(number)
Ejemplo:
SELECT CEIL(amount) AS rounded_up
FROM payment
LIMIT 3;
Resultado: redondea amount hacia arriba al entero más cercano.
FLOOR(): redondea un número hacia abajo (al entero más cercano).
Sintaxis:
FLOOR(number)
Ejemplo:
SELECT FLOOR(amount) AS rounded_down
FROM payment
LIMIT 3;
Resultado: redondea amount hacia abajo al entero más cercano.
ROUND(): redondea un número a la cantidad de decimales indicada.
Sintaxis:
ROUND(number, decimals)
Ejemplo:
SELECT ROUND(amount, 1) AS rounded_amount
FROM payment
LIMIT 3;
Resultado: redondea amount a un decimal.
POWER() / POW(): eleva un número a una potencia.
Sintaxis:
POWER(number, exponent)
POW(number, exponent)
Ejemplo:
SELECT POWER(amount, 2) AS squared_amount
FROM payment
LIMIT 3;
Resultado: eleva amount al cuadrado.
SQRT(): devuelve la raíz cuadrada de un número.
Sintaxis:
SQRT(number)
Ejemplo:
SELECT SQRT(amount) AS sqrt_amount
FROM payment
LIMIT 3;
Resultado: devuelve la raíz cuadrada de amount.
PI(): devuelve la constante matemática pi.
Sintaxis:
PI()
Ejemplo:
SELECT PI() AS pi_value;
Resultado: devuelve el valor de pi (aproximadamente 3.141592653589793).
MOD(): devuelve el resto de una división.
Sintaxis:
MOD(dividend, divisor)
Ejemplo:
SELECT MOD(payment_id, 5) AS mod_result
FROM payment
LIMIT 3;
Resultado: devuelve el resto de dividir payment_id entre 5.
Ejemplo de uso de una función en WHERE (buscar valores pares):
SELECT payment_id, amount
FROM payment
WHERE MOD(payment_id, 2) = 0
LIMIT 10;
Resultado: devuelve solo las filas con un payment_id par.
SIGN(): devuelve el signo de un número (-1, 0 o 1).
Sintaxis:
SIGN(number)
Ejemplo:
SELECT SIGN(amount - 5) AS sign_value
FROM payment
LIMIT 3;
Resultado: devuelve -1 si el valor es negativo, 0 si es cero y 1 si es positivo.
GREATEST(): devuelve el mayor de los valores indicados (MySQL, PostgreSQL).
Sintaxis:
GREATEST(value1, value2, ...)
Ejemplo:
SELECT GREATEST(amount, 5) AS max_value
FROM payment
LIMIT 3;
Resultado: devuelve el mayor de los dos valores: amount o 5.
Importante (NULL): el comportamiento de GREATEST() depende del SGBD.
- En MySQL/MariaDB, si al menos un argumento es
NULL, el resultado suele serNULL. - En PostgreSQL, los argumentos
NULLse ignoran, y solo se devuelveNULLsi todos los argumentos sonNULL.
LEAST(): devuelve el menor de los valores indicados (MySQL, PostgreSQL).
Sintaxis:
LEAST(value1, value2, ...)
Ejemplo:
SELECT LEAST(amount, 5) AS min_value
FROM payment
LIMIT 3;
Resultado: devuelve el menor de los dos valores: amount o 5.
Importante (NULL): LEAST() sigue las mismas diferencias entre SGBD con NULL que GREATEST().
Para que el comportamiento sea predecible en distintos SGBD, se suele usar COALESCE(), por ejemplo:
SELECT GREATEST(COALESCE(value1, 0), COALESCE(value2, 0));
RAND(): devuelve un número aleatorio entre 0 y 1.
Sintaxis:
RAND()
Ejemplo:
SELECT RAND() AS random_value
FROM payment
LIMIT 3;
Resultado: devuelve un número aleatorio entre 0 y 1.
Importante: no des por hecho que RAND() se recalcula siempre para cada fila en todos los contextos. Según el SGBD, el plan de ejecución, el uso de CTE o subconsultas y otros factores, el mismo valor aleatorio puede reutilizarse en varias filas.
Si necesitas sí o sí valores aleatorios distintos por fila, comprueba el comportamiento en tu SGBD y con la forma exacta de tu consulta.
Casos de uso prácticos
Redondear importes de pago: Usa
ROUND(amount, 0)para redondear los valores a números enteros.Encontrar registros por el resto de una división: Usa
MOD(payment_id, 2)enWHERE(por ejemplo,MOD(payment_id, 2) = 0) para encontrar los identificadores de pago pares.Calcular raíces cuadradas: Usa
SQRT(amount)para analizar la distribución de los pagos.Comparar valores: Usa
GREATEST()yLEAST()para elegir el valor máximo o mínimo entre varios.Controlar los tipos de datos: Si la precisión importa, convierte explícitamente los valores al tipo necesario (por ejemplo,
CAST(value AS DECIMAL(10,2))) para evitar sorpresas por la aritmética entera y el redondeo.
Preguntas frecuentes
¿Qué diferencia hay entre ROUND(), CEIL() y FLOOR()?
ROUND() redondea al valor más cercano (o al número de decimales indicado), CEIL() siempre redondea hacia arriba y FLOOR(), siempre hacia abajo.
¿Por qué fórmulas parecidas pueden dar resultados distintos?
La razón principal son los tipos de datos. Los tipos enteros y decimales tratan de forma diferente la división, el redondeo y la precisión.
¿Cuándo conviene usar MOD()?
MOD() es útil para comprobaciones periódicas, por ejemplo para repartir registros en grupos o filtrar identificadores pares o impares.
¿Por qué hay que tener en cuenta las diferencias entre SGBD en GREATEST() y LEAST()?
Porque el tratamiento de NULL puede variar entre MySQL/MariaDB y PostgreSQL. Para un comportamiento predecible, se suele usar COALESCE().
Preguntas de entrevista
¿Cómo eliges la función de redondeo adecuada para una regla de negocio?
Primero define la regla: redondeo estándar (ROUND), siempre hacia arriba (CEIL) o siempre hacia abajo (FLOOR). Después comprueba cómo afecta a las métricas finales del informe.
¿Qué riesgos tienen los cálculos sin conversión explícita de tipos?
Puedes obtener resultados inesperados por la división entera o por pérdida de precisión. En los cálculos críticos, las conversiones explícitas como CAST(... AS DECIMAL(...)) son más seguras.
¿Qué hace SIGN() y para qué sirve?
SIGN() devuelve -1, 0 o 1 según el signo del valor. Es útil para clasificar rápidamente desviaciones como negativas, nulas o positivas.
¿Por qué hay que usar RAND() con cuidado en consultas analíticas?
Según el SGBD y el plan de ejecución, puede que los valores aleatorios no se recalculen fila a fila como esperas. Comprueba siempre el comportamiento en tu motor.
Puntos clave de esta lección:
- Las funciones matemáticas de SQL permiten hacer cálculos y transformaciones directamente en las consultas.
ROUND,CEILyFLOORresuelven tareas de redondeo distintas, y la elección correcta depende de las reglas de negocio.MOD,POWERySQRTson prácticas para el análisis y la comprobación de datos.- Los tipos de datos influyen mucho en la precisión y en el resultado final de los cálculos.
- En las consultas para varios SGBD, ten en cuenta las diferencias en el tratamiento de
NULLdentro de las funciones.