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;
nombreprecio
Zapatillas running pro129.99
Estantería modular149.99
Zapatillas trail149.99
Mancuernas ajustables199.99
Robot de cocina249.99
Escritorio ajustable399.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 < 500

BETWEEN 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;
idfecha_pedidoestadototal
52025-11-02 10:20:00entregado1899.99
62025-11-05 13:30:00entregado179.97
72025-11-10 09:00:00enviado259.98
82025-11-15 17:20:00enviado1399.00
92025-11-18 12:00:00enviado129.99
102025-11-22 08:45:00procesando599.99
112025-11-25 15:10:00procesando84.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;
nombrepuestosalario
DanielVendedor32000.00
PatriciaVendedora32000.00
CristinaResponsable de Almacén35000.00
NataliaVendedora Senior38000.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;
nombreciudad
LucíaA Coruña
CarlosBarcelona
LauraBarcelona
AlejandroBilbao
FernandoBurgos
MiguelCórdoba
MartaGijón
DiegoLas Palmas
MaríaMadrid
PedroMadrid
DavidMá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;
nombreprecio
198412.99
Cien años de soledad14.99
El nombre del viento16.99
Cable USB-C a Lightning19.99
Banda elástica set x519.99
Camiseta algodón básica24.99
......
Xiaomi 14599.99
Sofá 3 plazas599.00
Google Pixel 8699.00
Samsung Galaxy S24899.99
iPhone 15 Pro1299.99
MacBook Air M31399.00
Lenovo ThinkPad X11549.00
ASUS ROG Zephyrus1899.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;
nombrepreciostock
Camiseta algodón básica24.99500
Cable USB-C a Lightning19.99300
Funda iPhone silicona49.99200
Banda elástica set x519.99200
Camiseta técnica running34.99180
Cargador USB-C 65W35.99150
198412.99110
Esterilla yoga premium29.99100

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:

Simulador SQL
Ctrl+Enter para ejecutar

En el siguiente artículo veremos el operador LIKE para buscar patrones en cadenas de texto.

Escrito por Eduardo Lázaro