BETWEEN
El operador BETWEEN filtra valores que están dentro de un rango, incluyendo ambos extremos. Es una forma más clara y concisa de expresar una condición con >= y <=.
Sintaxis
SELECT columnas
FROM tabla
WHERE columna BETWEEN valor_minimo AND valor_maximo;BETWEEN valor_minimo AND valor_maximo es equivalente a columna >= valor_minimo AND columna <= valor_maximo. El AND que aparece aquí forma parte de la sintaxis de BETWEEN, no es el operador lógico AND.
BETWEEN con números
Productos con precio entre 100 y 500 euros:
SELECT nombre, precio
FROM productos
WHERE precio BETWEEN 100 AND 500
ORDER BY precio;| nombre | precio |
|---|---|
| Zapatillas running pro | 129.99 |
| Estantería modular | 149.99 |
| Zapatillas trail | 149.99 |
| Mancuernas ajustables | 199.99 |
| Robot de cocina | 249.99 |
| Escritorio ajustable | 399.00 |
Los 6 productos devueltos tienen precios entre 100 y 500 euros, ambos inclusive. Si hubiera un producto con precio exactamente 100 o exactamente 500, también aparecería.
Es importante recordar que BETWEEN incluye los extremos. Si necesitas un rango exclusivo (sin incluir los límites), usa operadores de comparación directamente:
-- Rango exclusivo: mayor que 100 y menor que 500
WHERE precio > 100 AND precio < 500BETWEEN con fechas
BETWEEN es especialmente útil con fechas. Pedidos realizados durante noviembre de 2025:
SELECT id, fecha_pedido, estado, total
FROM pedidos
WHERE fecha_pedido BETWEEN '2025-11-01' AND '2025-11-30'
ORDER BY fecha_pedido;| id | fecha_pedido | estado | total |
|---|---|---|---|
| 5 | 2025-11-02 10:20:00 | entregado | 1899.99 |
| 6 | 2025-11-05 13:30:00 | entregado | 179.97 |
| 7 | 2025-11-10 09:00:00 | enviado | 259.98 |
| 8 | 2025-11-15 17:20:00 | enviado | 1399.00 |
| 9 | 2025-11-18 12:00:00 | enviado | 129.99 |
| 10 | 2025-11-22 08:45:00 | procesando | 599.99 |
| 11 | 2025-11-25 15:10:00 | procesando | 84.97 |
Hay un detalle sutil con fechas que conviene tener en cuenta. Cuando la columna es de tipo DATETIME y usas BETWEEN con solo fechas (sin hora), MySQL interpreta '2025-11-30' como '2025-11-30 00:00:00'. Esto significa que un pedido realizado el 30 de noviembre a las 15:00 no se incluiría, porque '2025-11-30 15:00:00' es posterior a '2025-11-30 00:00:00'.
Para asegurarte de incluir todo el día final, puedes especificar la hora máxima o usar el primer instante del día siguiente:
-- Opción 1: hora máxima del último día
WHERE fecha_pedido BETWEEN '2025-11-01' AND '2025-11-30 23:59:59'
-- Opción 2: hasta antes del día siguiente (más preciso)
WHERE fecha_pedido >= '2025-11-01'
AND fecha_pedido < '2025-12-01'La opción 2 es técnicamente más correcta porque cubre hasta las 23:59:59.999999, no solo hasta 23:59:59.
BETWEEN con empleados
Empleados con salario entre 30000 y 50000:
SELECT nombre, puesto, salario
FROM empleados
WHERE salario BETWEEN 30000 AND 50000
ORDER BY salario;| nombre | puesto | salario |
|---|---|---|
| Daniel | Vendedor | 32000.00 |
| Patricia | Vendedora | 32000.00 |
| Cristina | Responsable de Almacén | 35000.00 |
| Natalia | Vendedora Senior | 38000.00 |
BETWEEN con texto
BETWEEN también funciona con cadenas de texto. La comparación se realiza según el orden de la collation:
SELECT nombre, ciudad
FROM clientes
WHERE ciudad BETWEEN 'A' AND 'M'
ORDER BY ciudad;| nombre | ciudad |
|---|---|
| Lucía | A Coruña |
| Carlos | Barcelona |
| Laura | Barcelona |
| Alejandro | Bilbao |
| Fernando | Burgos |
| Miguel | Córdoba |
| Marta | Gijón |
| Diego | Las Palmas |
| María | Madrid |
| Pedro | Madrid |
| David | Málaga |
Las ciudades desde la A hasta la M (alfabéticamente). Aunque BETWEEN con texto funciona, es menos habitual que con números y fechas, y puede dar resultados confusos si no conoces bien la collation de tu base de datos.
NOT BETWEEN
NOT BETWEEN devuelve las filas cuyo valor está fuera del rango:
SELECT nombre, precio
FROM productos
WHERE precio NOT BETWEEN 50 AND 500
ORDER BY precio;| nombre | precio |
|---|---|
| 1984 | 12.99 |
| Cien años de soledad | 14.99 |
| El nombre del viento | 16.99 |
| Cable USB-C a Lightning | 19.99 |
| Banda elástica set x5 | 19.99 |
| Camiseta algodón básica | 24.99 |
| ... | ... |
| Xiaomi 14 | 599.99 |
| Sofá 3 plazas | 599.00 |
| Google Pixel 8 | 699.00 |
| Samsung Galaxy S24 | 899.99 |
| iPhone 15 Pro | 1299.99 |
| MacBook Air M3 | 1399.00 |
| Lenovo ThinkPad X1 | 1549.00 |
| ASUS ROG Zephyrus | 1899.99 |
NOT BETWEEN 50 AND 500 es equivalente a precio < 50 OR precio > 500. Los productos que cuestan exactamente 50 o 500 se excluirían.
BETWEEN con otras condiciones
Puedes combinar BETWEEN con cualquier otra condición usando AND y OR:
SELECT nombre, precio, stock
FROM productos
WHERE precio BETWEEN 20 AND 100
AND stock > 100
ORDER BY stock DESC;| nombre | precio | stock |
|---|---|---|
| Camiseta algodón básica | 24.99 | 500 |
| Cable USB-C a Lightning | 19.99 | 300 |
| Funda iPhone silicona | 49.99 | 200 |
| Banda elástica set x5 | 19.99 | 200 |
| Camiseta técnica running | 34.99 | 180 |
| Cargador USB-C 65W | 35.99 | 150 |
| 1984 | 12.99 | 110 |
| Esterilla yoga premium | 29.99 | 100 |
Productos con precio accesible (entre 20 y 100 euros) que además tienen un stock alto (más de 100 unidades).
BETWEEN y NULL
Si el valor de la columna es NULL, BETWEEN devuelve NULL, que se trata como falso:
SELECT nombre, telefono
FROM clientes
WHERE telefono BETWEEN '600000000' AND '699999999';Los clientes sin teléfono (NULL) no aparecen en el resultado, independientemente del rango especificado. Esto es el comportamiento esperado: no tiene sentido preguntar si un valor desconocido está dentro de un rango.
El orden de los valores importa
El valor mínimo siempre debe ir primero. Si inviertes el orden, BETWEEN no devuelve resultados:
-- Esto NO funciona como esperas
SELECT nombre, precio
FROM productos
WHERE precio BETWEEN 500 AND 100;Empty set (0.00 sec)
BETWEEN 500 AND 100 equivale a precio >= 500 AND precio <= 100, que es imposible. Ningún número es simultáneamente mayor o igual a 500 y menor o igual a 100.
Practica con BETWEEN
Usa el editor para probar rangos de precios, fechas o cualquier valor numérico:
En el siguiente artículo veremos el operador LIKE para buscar patrones en cadenas de texto.
Escrito por Eduardo Lázaro
