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 divisorLas 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_tres | diez_entre_cinco | diez_entre_diez | diez_entre_siete |
|---|---|---|---|
| 1 | 0 | 0 | 3 |
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;| id | nombre | resto | tipo |
|---|---|---|---|
| 1 | iPhone 15 Pro | 1 | Impar |
| 2 | MacBook Air M2 | 0 | Par |
| 3 | AirPods Pro | 1 | Impar |
| 4 | iPad Air | 0 | Par |
| 5 | Apple Watch Series 9 | 1 | Impar |
| 6 | HomePod mini | 0 | Par |
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;| id | nombre | precio | color_fondo |
|---|---|---|---|
| 1 | iPhone 15 Pro | 1299.99 | #ffffff |
| 2 | MacBook Air M2 | 1199.99 | #f0f0f0 |
| 3 | AirPods Pro | 249.99 | #ffffff |
| 4 | iPad Air | 599.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;| nombre | grupo |
|---|---|
| iPhone 15 Pro | 1 |
| MacBook Air M2 | 2 |
| AirPods Pro | 3 |
| iPad Air | 1 |
| Apple Watch Series 9 | 2 |
| HomePod mini | 3 |
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_totales | horas | minutos | formato |
|---|---|---|---|
| 137 | 2 | 17 | 2h 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_pos | neg_pos | pos_neg |
|---|---|---|
| 1 | -1 | 1 |
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_operador | con_funcion |
|---|---|
| 2 | 2 |
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
