ABS
La función ABS devuelve el valor absoluto de un número. El valor absoluto es simplemente el número sin su signo: si es positivo, lo deja igual; si es negativo, le quita el signo menos. Matemáticamente, es la distancia de un número al cero en la recta numérica, sin importar en qué dirección.
Esta función es fundamental cuando trabajas con diferencias, distancias o desviaciones, porque en esos casos normalmente no te importa si un valor está "por encima" o "por debajo" de otro, solo cuánto se desvía.
Sintaxis
ABS(numero)La función recibe un único argumento numérico (entero, decimal, o expresión) y devuelve un número del mismo tipo pero siempre positivo o cero. Si el argumento es NULL, devuelve NULL.
Comportamiento básico
El concepto es muy sencillo, pero veamos todos los casos para que quede completamente claro:
SELECT ABS(42) AS positivo, ABS(-42) AS negativo, ABS(0) AS cero;| positivo | negativo | cero |
|---|---|---|
| 42 | 42 | 0 |
Un número positivo se devuelve tal cual. Un número negativo se convierte a positivo. El cero es su propio valor absoluto.
Con decimales funciona exactamente igual:
SELECT ABS(3.14) AS positivo, ABS(-3.14) AS negativo;| positivo | negativo |
|---|---|
| 3.14 | 3.14 |
¿Por qué no simplemente multiplicar por -1?
Podrías pensar que ABS(x) es equivalente a x * -1, pero no lo es. x * -1 convierte positivos en negativos y negativos en positivos. ABS(x) siempre devuelve un positivo, independientemente del signo original. Solo son equivalentes cuando sabes de antemano que x es negativo, lo cual raramente es el caso cuando trabajas con columnas de la base de datos.
Caso práctico: diferencia de precios
Imagina que quieres comparar el precio de dos productos y saber cuánto difieren. Si restas el precio del producto A menos el del producto B, el resultado puede ser positivo o negativo dependiendo de cuál sea más caro. Pero normalmente lo que te interesa es simplemente la diferencia, sin importar cuál es mayor:
SELECT
p1.nombre AS producto_1,
p2.nombre AS producto_2,
p1.precio - p2.precio AS diferencia_con_signo,
ABS(p1.precio - p2.precio) AS diferencia_absoluta
FROM productos p1
CROSS JOIN productos p2
WHERE p1.id = 1 AND p2.id = 3;| producto_1 | producto_2 | diferencia_con_signo | diferencia_absoluta |
|---|---|---|---|
| iPhone 15 Pro | AirPods Pro | 1050.00 | 1050.00 |
En este caso la diferencia ya es positiva porque el iPhone es más caro. Pero si invertimos el orden (AirPods - iPhone), obtendríamos -1050.00. Con ABS, siempre obtienes 1050.00 sin importar el orden. Esto es especialmente útil cuando comparas precios en un JOIN y no puedes controlar cuál producto viene primero.
Caso práctico: desviación respecto a un objetivo
Un uso muy frecuente de ABS es medir cuánto se desvía un valor de un objetivo o referencia. Por ejemplo, si tu objetivo de stock es 50 unidades, ¿qué productos están más lejos de ese objetivo?
SELECT
nombre,
stock,
50 AS objetivo,
stock - 50 AS diferencia,
ABS(stock - 50) AS desviacion
FROM productos
LIMIT 5;| nombre | stock | objetivo | diferencia | desviacion |
|---|---|---|---|---|
| iPhone 15 Pro | 50 | 50 | 0 | 0 |
| MacBook Air M2 | 30 | 50 | -20 | 20 |
| AirPods Pro | 100 | 50 | 50 | 50 |
| iPad Air | 25 | 50 | -25 | 25 |
| Apple Watch Series 9 | 45 | 50 | -5 | 5 |
La columna diferencia te dice si estás por encima (positivo) o por debajo (negativo) del objetivo. La columna desviacion te dice cuánto estás desviado, sin importar la dirección. MacBook Air tiene -20 (le faltan 20) y AirPods tiene +50 (le sobran 50). Pero en términos de desviación absoluta, AirPods (50) está más lejos del objetivo que MacBook (20).
Esta es la esencia del valor absoluto: cuando te importa la magnitud pero no la dirección.
Caso práctico: ordenar por proximidad
Otro uso muy potente de ABS es encontrar los valores más cercanos a un punto de referencia. Si un cliente quiere un producto que cueste alrededor de 500 euros, puedes ordenar los productos por proximidad a ese precio:
SELECT nombre, precio,
ABS(precio - 500) AS distancia_a_500
FROM productos
ORDER BY ABS(precio - 500)
LIMIT 5;Los productos se ordenarán de más cercano a más lejano del precio de 500 euros. Un producto de 450 y otro de 550 tendrán la misma distancia (50), porque ambos están igual de lejos del objetivo. Sin ABS, los productos con precio inferior a 500 tendrían distancia negativa y aparecerían primero, lo cual no tiene sentido en este contexto.
Este patrón es muy útil en buscadores, sistemas de recomendación, y cualquier funcionalidad donde necesites encontrar "el más parecido a X".
Caso práctico: variación porcentual
Cuando calculas variaciones porcentuales (por ejemplo, cambios de precio), a veces te interesa solo la magnitud del cambio, no si subió o bajó:
SELECT
nombre,
precio AS precio_actual,
precio * 0.9 AS precio_anterior,
ROUND((precio - precio * 0.9) / (precio * 0.9) * 100, 2) AS variacion_pct,
ROUND(ABS((precio - precio * 0.9) / (precio * 0.9)) * 100, 2) AS variacion_absoluta_pct
FROM productos
LIMIT 3;La variación absoluta te permite responder preguntas como "¿qué productos han cambiado más de precio?" sin importar si el cambio fue una subida o una bajada.
Caso práctico: validar tolerancias
En manufactura, control de calidad, o simplemente al comparar datos, a menudo necesitas verificar si un valor está dentro de una tolerancia aceptable. Por ejemplo, si un precio puede desviarse como máximo un 10% del precio de referencia:
SELECT
nombre,
precio,
1000 AS precio_referencia,
ABS(precio - 1000) AS desviacion,
CASE
WHEN ABS(precio - 1000) <= 300 THEN 'Dentro de tolerancia'
ELSE 'Fuera de tolerancia'
END AS estado
FROM productos
LIMIT 5;| nombre | precio | precio_referencia | desviacion | estado |
|---|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 1000 | 299.99 | Dentro de tolerancia |
| MacBook Air M2 | 1199.99 | 1000 | 199.99 | Dentro de tolerancia |
| AirPods Pro | 249.99 | 1000 | 750.01 | Fuera de tolerancia |
| iPad Air | 599.99 | 1000 | 400.01 | Fuera de tolerancia |
| Apple Watch Series 9 | 399.99 | 1000 | 600.01 | Fuera de tolerancia |
Sin ABS, tendrías que escribir dos condiciones separadas: una para verificar que el precio no sea demasiado alto y otra para que no sea demasiado bajo. Con ABS, una sola comparación cubre ambos casos.
ABS con NULL
Como todas las funciones numéricas en MySQL, ABS propaga los valores nulos. Si le pasas NULL, devuelve NULL sin generar error:
SELECT ABS(NULL) AS resultado;| resultado |
|---|
| NULL |
Si trabajas con columnas que pueden ser nulas, usa IFNULL o COALESCE para definir un valor por defecto:
SELECT ABS(IFNULL(stock, 0) - 50) AS desviacion
FROM productos;ABS en combinación con otras funciones
ABS se combina frecuentemente con funciones de agregación para calcular desviaciones medias:
SELECT
ROUND(AVG(ABS(precio - (SELECT AVG(precio) FROM productos))), 2) AS desviacion_media
FROM productos;Esta consulta calcula la desviación media absoluta (MAD) de los precios: primero obtiene el precio medio, luego calcula cuánto se desvía cada producto de ese precio medio (en valor absoluto), y finalmente promedia todas esas desviaciones. Es una medida estadística de dispersión alternativa a la desviación estándar, más robusta frente a valores atípicos.
Practica con ABS
Usa el editor para calcular valores absolutos:
En el siguiente artículo veremos CEIL para redondear hacia arriba.
Escrito por Eduardo Lázaro
