Eliminar registros por rango utilizando BETWEEN en SQL
Cuando trabajamos con bases de datos que contienen miles o incluso millones de registros, hay operaciones que no tiene ningún sentido realizar una a una.
Imaginemos que tenemos una tabla con más de 50.000 registros y necesitamos eliminar un conjunto concreto de ellos porque ya no son necesarios.
Podríamos ir registro por registro, pero evidentemente no sería la solución más lógica.
SQL nos proporciona una herramienta muy sencilla para trabajar con rangos de valores: el operador BETWEEN.
Importante
En este artículo voy a utilizar DELETE para los ejemplos. Antes de ejecutar una eliminación masiva, conviene comprobar primero qué registros vamos a afectar utilizando un SELECT.
¿Qué es BETWEEN?
El operador BETWEEN permite comprobar si un valor se encuentra dentro de un rango determinado.
Su sintaxis básica es:
SELECT columna FROM tabla WHERE columna BETWEEN valor1 AND valor2;
Por ejemplo, si queremos obtener los registros cuyos identificadores estén entre 100 y 200:
SELECT * FROM mi_tabla WHERE id BETWEEN 100 AND 200;
Hay un detalle importante que debemos recordar:
BETWEEN incluye los extremos
La consulta BETWEEN 100 AND 200 incluye tanto el 100 como el 200.
Es decir, conceptualmente:
100 ≤ id ≤ 200
Utilizar BETWEEN para eliminar registros
Y aquí es donde empieza la parte interesante.
Si necesitamos eliminar todos los registros cuyo ID esté comprendido entre dos valores, podemos utilizar exactamente la misma condición con un DELETE:
DELETE FROM mi_tabla WHERE id BETWEEN 100 AND 200;
Con una única sentencia estaremos indicando a MySQL que elimine todos los registros cuyo id esté comprendido entre 100 y 200, ambos incluidos.
Si tenemos miles de registros que cumplen esa condición, no necesitamos recorrerlos uno a uno desde nuestra aplicación.
Primero SELECT, después DELETE
Antes de ejecutar una eliminación masiva, hay una costumbre que puede ahorrarnos muchos disgustos:
probar primero exactamente la misma condición utilizando un SELECT.
Por ejemplo:
SELECT * FROM mi_tabla WHERE id BETWEEN 100 AND 200;
Así podemos comprobar qué registros vamos a eliminar.
Si el resultado es exactamente el que esperábamos, entonces podemos realizar la eliminación:
DELETE FROM mi_tabla WHERE id BETWEEN 100 AND 200;
Mucho cuidado con DELETE
Un DELETE sin una condición WHERE puede eliminar todos los registros de una tabla. Antes de ejecutar una consulta de este tipo, revisa siempre la condición.
También podemos utilizar < y >
BETWEEN no es la única posibilidad.
Si necesitamos definir el rango de una manera más específica, podemos utilizar operadores de comparación como:
>mayor que.<menor que.>=mayor o igual que.<=menor o igual que.<>diferente de.
Por ejemplo, para eliminar los registros cuyo ID sea mayor que 100 y menor que 200:
DELETE FROM mi_tabla WHERE id > 100 AND id < 200;
Fíjate en una diferencia importante respecto a BETWEEN.
Esta condición:
id > 100 AND id < 200
no incluye los valores 100 ni 200.
En otras palabras:
100 < id < 200
Si quisiéramos incluirlos, podríamos utilizar:
DELETE FROM mi_tabla WHERE id >= 100 AND id <= 200;
Esto sería equivalente, en este caso, a:
DELETE FROM mi_tabla WHERE id BETWEEN 100 AND 200;
BETWEEN no sirve únicamente para IDs
Aunque en este ejemplo estoy utilizando un campo id, BETWEEN puede utilizarse con otros tipos de datos.
Por ejemplo, podemos trabajar con números:
SELECT * FROM productos WHERE precio BETWEEN 10 AND 50;
Con fechas:
SELECT * FROM pedidos WHERE fechaPedido BETWEEN '2026-01-01' AND '2026-01-31';
O incluso utilizarlo para realizar una eliminación basada en fechas:
DELETE FROM registros WHERE fechaRegistro BETWEEN '2025-01-01' AND '2025-01-31';
En este último caso debemos prestar especial atención al tipo de columna si estamos trabajando con fechas y horas (DATETIME), ya que el valor final del rango puede no comportarse como esperamos cuando contiene una hora.
Combinar BETWEEN con otras condiciones
También podemos combinar el rango con otras condiciones mediante AND y OR.
Por ejemplo, podríamos eliminar productos cuyo ID esté dentro de un rango y que además pertenezcan a una determinada categoría:
DELETE FROM productos WHERE id BETWEEN 1000 AND 2000 AND idCategoria = 5;
De esta manera no estamos eliminando todos los registros del rango, sino únicamente aquellos que cumplen ambas condiciones.
Cuanto más específica sea nuestra condición, menor será el riesgo de afectar registros que no queríamos tocar.
¿Y si necesitamos varios rangos?
También podemos combinar diferentes condiciones.
Por ejemplo:
SELECT * FROM mi_tabla WHERE id BETWEEN 100 AND 200 OR id BETWEEN 500 AND 600;
Esto nos permitiría obtener dos rangos diferentes con una sola consulta.
Si vamos a utilizar OR junto con otras condiciones más complejas, conviene utilizar paréntesis para dejar perfectamente claro qué queremos que evalúe SQL.
¿Qué ocurre si tenemos 50.000 registros?
Precisamente aquí es donde este tipo de consultas resulta especialmente interesante.
Si nuestra tabla contiene 50.000 registros y queremos eliminar, por ejemplo, los registros del id 10.000 al id 20.000, no necesitamos realizar miles de peticiones desde PHP.
Podemos expresar la operación directamente en SQL:
DELETE FROM mi_tabla WHERE id BETWEEN 10000 AND 20000;
La base de datos se encargará de localizar los registros que cumplen la condición y ejecutar la operación.
Eso sí, que podamos hacerlo con una sola sentencia no significa que debamos ejecutarlo a ciegas.
Antes:
SELECT COUNT(*) FROM mi_tabla WHERE id BETWEEN 10000 AND 20000;
Así podemos saber cuántos registros vamos a afectar antes de eliminarlos.
Y todavía mejor:
SELECT * FROM mi_tabla WHERE id BETWEEN 10000 AND 20000 LIMIT 100;
Podemos revisar una muestra de los registros afectados antes de ejecutar el DELETE.
Una última precaución: las transacciones
Si estamos trabajando con datos importantes y nuestra tabla utiliza un motor transaccional como InnoDB, podemos plantearnos utilizar una transacción.
Por ejemplo:
START TRANSACTION; DELETE FROM mi_tabla WHERE id BETWEEN 10000 AND 20000; -- Si todo es correcto: COMMIT; -- Si necesitamos deshacer: -- ROLLBACK;
La idea es sencilla: mientras la transacción está abierta podemos decidir si confirmamos los cambios o los revertimos.
Esto es especialmente interesante cuando estamos realizando operaciones importantes sobre datos que no podemos permitirnos perder por accidente.
Conclusión
BETWEEN es un operador sencillo, pero resulta tremendamente útil cuando necesitamos trabajar con rangos.
Puede utilizarse para consultar, actualizar o eliminar registros sin necesidad de procesarlos uno a uno desde nuestra aplicación.
Algunos ejemplos:
-- Consultar SELECT * FROM mi_tabla WHERE id BETWEEN 100 AND 200; -- Actualizar UPDATE mi_tabla SET estado = 'archivado' WHERE id BETWEEN 100 AND 200; -- Eliminar DELETE FROM mi_tabla WHERE id BETWEEN 100 AND 200;
Y recuerda el pequeño ritual antes de ejecutar un DELETE masivo:
- Comprueba la condición.
- Ejecuta primero un
SELECT. - Comprueba cuántos registros devuelve.
- Si los datos son importantes, realiza un backup.
- Si procede, utiliza una transacción.
- Entonces ejecuta el
DELETE.
Menos trabajo, más SQL.
Cuando tenemos miles de registros que cumplen una condición, la base de datos está precisamente para eso. No hace falta poner a PHP a dar vueltas por 50.000 registros si podemos expresar la operación correctamente en una sola consulta.
Y, sobre todo, antes de darle al botón de ejecutar un DELETE con cinco ceros detrás, mira dos veces el WHERE.
Visitas: 2469
Automation & Data Specialist | Web Development | Data Processing & Integration
