MOD

La función MOD devuelve el resto de la división entre dos números. También conocida como "módulo" o "operación de resto". Es la misma operación que aprendiste en el colegio como "resto de la división": 10 dividido entre 3 da 3, con resto 1. Ese "resto 1" es exactamente lo que devuelve MOD(10, 3).

Aunque pueda parecer una función simple, MOD es sorprendentemente útil en programación. Se usa constantemente para alternar valores, distribuir elementos, detectar patrones cíclicos y verificar divisibilidad.

Sintaxis

MySQL ofrece tres formas de calcular el módulo, todas equivalentes:

-- Como función
MOD(dividendo, divisor)
 
-- Con operador %
dividendo % divisor
 
-- Como operador textual
dividendo MOD divisor

Las tres formas producen exactamente el mismo resultado. La más habitual es la función MOD() o el operador %.

Comportamiento básico

La operación módulo responde a la pregunta: "si divido A entre B, ¿cuánto me sobra?"

SELECT MOD(10, 3) AS resultado;
resultado
1

10 ÷ 3 = 3, con resto 1. Es decir, 3 × 3 = 9, y 10 - 9 = 1. Ese 1 es el módulo.

Veamos más ejemplos para construir intuición:

SELECT
    MOD(10, 3) AS diez_entre_tres,
    MOD(10, 5) AS diez_entre_cinco,
    MOD(10, 10) AS diez_entre_diez,
    MOD(10, 7) AS diez_entre_siete;
diez_entre_tresdiez_entre_cincodiez_entre_diezdiez_entre_siete
1003

Cuando la división es exacta (10÷5 o 10÷10), el resto es 0. Ese es precisamente el patrón que usamos para verificar divisibilidad: si MOD(x, y) = 0, entonces x es divisible por y.

Caso práctico: verificar par o impar

El uso más clásico de MOD es determinar si un número es par o impar. Un número es par si es divisible por 2 (resto 0), e impar si no lo es (resto 1):

SELECT
    id,
    nombre,
    MOD(id, 2) AS resto,
    CASE WHEN MOD(id, 2) = 0 THEN 'Par' ELSE 'Impar' END AS tipo
FROM productos
LIMIT 6;
idnombrerestotipo
1iPhone 15 Pro1Impar
2MacBook Air M20Par
3AirPods Pro1Impar
4iPad Air0Par
5Apple Watch Series 91Impar
6HomePod mini0Par

Este patrón se usa frecuentemente para alternar estilos visuales: filas de color alterno en tablas, layouts alternados (imagen izquierda/derecha), etc.

Caso práctico: alternar colores de fila (zebra striping)

En aplicaciones web, a menudo quieres que las filas de una tabla alternen entre dos colores para mejorar la legibilidad. MOD te permite asignar un color basándote en si la posición es par o impar:

SELECT
    id,
    nombre,
    precio,
    CASE WHEN MOD(id, 2) = 0 THEN '#f0f0f0' ELSE '#ffffff' END AS color_fondo
FROM productos
LIMIT 4;
idnombrepreciocolor_fondo
1iPhone 15 Pro1299.99#ffffff
2MacBook Air M21199.99#f0f0f0
3AirPods Pro249.99#ffffff
4iPad Air599.99#f0f0f0

Hoy en día esto se hace mejor con CSS (:nth-child(even)), pero el concepto de MOD para alternar valores sigue siendo útil en muchos contextos: generar datos, scripts de migración, procedimientos almacenados, etc.

Caso práctico: distribuir elementos en grupos

Si necesitas distribuir N elementos en K grupos de forma equitativa, MOD es la herramienta perfecta. La idea es asignar a cada elemento un número de grupo basándote en su posición:

SELECT
    nombre,
    MOD(id - 1, 3) + 1 AS grupo
FROM productos
LIMIT 9;
nombregrupo
iPhone 15 Pro1
MacBook Air M22
AirPods Pro3
iPad Air1
Apple Watch Series 92
HomePod mini3

La fórmula MOD(id - 1, N) + 1 distribuye los elementos cíclicamente en N grupos. El -1 y +1 son necesarios porque los IDs empiezan en 1 pero MOD empieza en 0.

Este patrón es útil para: distribuir trabajo entre empleados, asignar turnos rotativos, balancear carga entre servidores, o dividir datos en particiones.

Caso práctico: convertir minutos a horas

MOD es esencial para descomponer cantidades en unidades mayores y menores. Para convertir 137 minutos en "2 horas y 17 minutos", necesitas FLOOR para las horas y MOD para los minutos restantes:

SELECT
    137 AS minutos_totales,
    FLOOR(137 / 60) AS horas,
    MOD(137, 60) AS minutos,
    CONCAT(FLOOR(137 / 60), 'h ', MOD(137, 60), 'min') AS formato;
minutos_totaleshorasminutosformato
1372172h 17min

El mismo patrón funciona para convertir segundos a minutos y segundos, céntimos a euros y céntimos, o cualquier conversión donde una unidad es múltiplo de otra.

MOD con divisor 0

A diferencia de la división normal, que produce error, MOD con divisor 0 devuelve NULL:

SELECT MOD(10, 0) AS resultado;
resultado
NULL

No se produce ningún error ni warning, simplemente se obtiene NULL. Esto es importante tenerlo en cuenta si el divisor viene de una columna que podría tener valor 0.

MOD con decimales

MOD no está limitada a números enteros. Funciona perfectamente con decimales:

SELECT MOD(10.5, 3) AS resultado;
resultado
1.5

10.5 ÷ 3 = 3 con resto 1.5. Esto puede ser útil cuando trabajas con medidas, coordenadas o cualquier valor decimal que necesites "envolver" en un rango.

MOD con números negativos

El comportamiento de MOD con números negativos puede ser confuso. En MySQL, el resultado tiene el mismo signo que el dividendo:

SELECT MOD(10, 3) AS pos_pos, MOD(-10, 3) AS neg_pos, MOD(10, -3) AS pos_neg;
pos_posneg_pospos_neg
1-11

MOD(-10, 3) = -1 porque el dividendo (-10) es negativo. Esto es importante saberlo si trabajas con números que pueden ser negativos.

Operador %

El operador % es simplemente un atajo para la función MOD. Son completamente equivalentes:

SELECT 17 % 5 AS con_operador, MOD(17, 5) AS con_funcion;
con_operadorcon_funcion
22

Usa el que te resulte más legible en cada contexto. En consultas complejas, la función MOD() suele ser más clara.

En el siguiente artículo veremos RAND para generar números aleatorios.

Escrito por Eduardo Lázaro