🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

Lesión 3.3 · Tiempo de lectura: ~8 min

En esta lección, aprenderás las funciones matemáticas básicas de SQL que te ayudarán a calcular y transformar datos numéricos directamente en consultas. Cubriremos redondeo, módulo, potencias, raíces y comparaciones de valores, con ejemplos prácticos de Sakila. Al final de la lección, podrás aplicar estas funciones con confianza en tareas analíticas y prácticas.

Funciones Matemáticas Básicas en SQL

Las funciones matemáticas en SQL se utilizan para realizar cálculos sobre datos numéricos. Te permiten redondear valores, encontrar valores mínimos y máximos, calcular restos, y mucho más. Esta lección cubre las funciones matemáticas más comúnmente utilizadas, con ejemplos basados en la base de datos Sakila.

Importante: los datos numéricos en SQL pueden utilizar diferentes tipos (INTEGER, REAL/FLOAT, DECIMAL/NUMERIC). La misma fórmula puede producir diferentes resultados dependiendo del tipo de dato (por ejemplo, debido a la división entera, redondeo y precisión). Si se ignoran los tipos de datos, el resultado final puede diferir de lo que esperas.

Funciones matemáticas básicas de SQL

Funciones Matemáticas Comunes

ABS() - Devuelve el valor absoluto de un número.

Sintaxis:

ABS(número)

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(número)
CEILING(número)

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(número)

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 un número específico de decimales.

Sintaxis:

ROUND(número, decimales)

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(número, exponente)
POW(número, exponente)

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(número)

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(dividendo, divisor)

Ejemplo:

SELECT MOD(payment_id, 5) AS mod_result
FROM payment
LIMIT 3;

Resultado: Devuelve el resto de payment_id dividido por 5.

Ejemplo de uso de una función en WHERE (encontrar valores pares):

SELECT payment_id, amount
FROM payment
WHERE MOD(payment_id, 2) = 0
LIMIT 10;

Resultado: Devuelve solo filas con valores de payment_id pares.

SIGN() - Devuelve el signo de un número (-1, 0 o 1).

Sintaxis:

SIGN(número)

Ejemplo:

SELECT SIGN(amount - 5) AS sign_value
FROM payment
LIMIT 3;

Resultado: Devuelve -1 si es negativo, 0 si es cero, y 1 si es positivo.

GREATEST() - Devuelve el valor más grande entre los valores proporcionados (MySQL, PostgreSQL).

Sintaxis:

GREATEST(valor1, valor2, ...)

Ejemplo:

SELECT GREATEST(amount, 5) AS max_value
FROM payment
LIMIT 3;

Resultado: Devuelve el valor mayor entre amount y 5.

Importante (NULL): El comportamiento de GREATEST() depende del DBMS.

  • En MySQL/MariaDB, si al menos un argumento es NULL, el resultado es generalmente NULL.
  • En PostgreSQL, los argumentos NULL son ignorados, y NULL se devuelve solo si todos los argumentos son NULL.

LEAST() - Devuelve el valor más pequeño entre los valores proporcionados (MySQL, PostgreSQL).

Sintaxis:

LEAST(valor1, valor2, ...)

Ejemplo:

SELECT LEAST(amount, 5) AS min_value
FROM payment
LIMIT 3;

Resultado: Devuelve el valor menor entre amount y 5.

Importante (NULL): LEAST() sigue el mismo comportamiento específico del DBMS para NULL que GREATEST().

Para hacer que el comportamiento sea predecible entre DBMS, a menudo se utiliza COALESCE(), por ejemplo:

SELECT GREATEST(COALESCE(valor1, 0), COALESCE(valor2, 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 asumas que RAND() siempre se re-evalúa para cada fila en cada contexto. Dependiendo del DBMS, el plan de ejecución, el uso de CTEs/subconsultas y otros factores, el mismo valor aleatorio puede ser reutilizado para múltiples filas.

Si los valores aleatorios a nivel de fila distintos son críticos, verifica el comportamiento en tu DBMS y la forma de la consulta.

Casos de Uso Prácticos

  1. Redondeo de montos de pago: Usa ROUND(amount, 0) para redondear valores a números enteros.

  2. Encontrar registros por resto: Usa MOD(payment_id, 2) en WHERE (por ejemplo, MOD(payment_id, 2) = 0) para encontrar IDs de pago pares.

  3. Calcular raíces cuadradas: Usa SQRT(amount) para analizar distribuciones de pagos.

  4. Comparar valores: Usa GREATEST() y LEAST() para elegir el máximo o mínimo de múltiples valores.

  5. Controlar tipos de datos: Si la precisión es importante, convierte explícitamente los valores al tipo requerido (por ejemplo, CAST(value AS DECIMAL(10,2))) para evitar sorpresas causadas por la aritmética entera y el redondeo.

Preguntas Frecuentes

¿Cuál es la diferencia entre ROUND(), CEIL() y FLOOR()?

ROUND() redondea al valor más cercano (o a un decimal específico), CEIL() siempre redondea hacia arriba, y FLOOR() siempre redondea hacia abajo.

¿Por qué pueden fórmulas similares devolver resultados diferentes?

La razón principal son los tipos de datos. Los tipos enteros y decimales manejan la división, el redondeo y la precisión de manera diferente.

¿Cuándo debo usar MOD()?

MOD() es útil cuando necesitas verificaciones periódicas, como dividir registros en grupos o filtrar identificadores pares/impares.

¿Por qué debería preocuparme por las diferencias de DBMS para GREATEST() y LEAST()?

Porque el manejo de NULL puede diferir entre MySQL/MariaDB y PostgreSQL. Para un comportamiento predecible, a menudo se utiliza 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). Luego valida cómo impacta en las métricas del informe final.

¿Cuáles son los riesgos de realizar cálculos sin conversión de tipo explícita?

Puedes obtener resultados inesperados debido a la división entera o pérdida de precisión. En cálculos críticos, las conversiones explícitas como CAST(... AS DECIMAL(...)) son más seguras.

¿Qué hace SIGN() y dónde es útil?

SIGN() devuelve -1, 0 o 1 según el signo del valor. Es útil para clasificar rápidamente las desviaciones como negativas, cero o positivas.

¿Por qué debería usarse RAND() con cuidado en consultas analíticas?

Dependiendo del comportamiento del DBMS y los planes de ejecución, los valores aleatorios pueden no recalcularse por fila como se espera. Siempre verifica el comportamiento en tu motor.


Conclusiones clave de esta lección:

  • Las funciones matemáticas de SQL te ayudan a realizar cálculos y transformaciones directamente en consultas.
  • ROUND, CEIL y FLOOR resuelven diferentes tareas de redondeo, y la elección correcta depende de las reglas de negocio.
  • MOD, POWER y SQRT son prácticos para análisis y verificaciones de datos.
  • Los tipos de datos afectan fuertemente la precisión y los resultados finales de los cálculos.
  • Para consultas entre DB, ten en cuenta el comportamiento específico del DBMS para NULL en las funciones.

En la próxima lección, pasaremos a las funciones de fecha y hora y aprenderemos cómo trabajar con valores temporales en SQL.