En SQL, BETWEEN
operador le permite comprobar los valores que están dentro de un rango determinado.
El BETWEEN
El operador especifica un rango para probar y devuelve TRUE
cuando el operando está dentro del rango de comparaciones.
Tabla de origen
La siguiente tabla se utiliza para los ejemplos de esta página.
SELECT * FROM Pets;
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Ejemplo
Aquí hay un ejemplo simple para demostrar BETWEEN
operador.
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
En este ejemplo, devolvimos todas las filas donde DOB
la columna estaba entre 2018-10-01
y 2020-09-17
.
En este caso, cuatro filas coincidieron con ese criterio y, por lo tanto, se devolvieron cuatro filas.
ENTRE es Inclusivo
El BETWEEN
operador. es inclusivo. Es decir, incluye los valores en cada extremo del rango. Si observa los resultados en el ejemplo anterior, verá que hay valores en ambos extremos que coinciden exactamente con las fechas que proporcionamos.
Es lo mismo que usar el operador mayor o igual que (>=
) combinado con el operador menor o igual que (<=
).
SELECT * FROM Pets
WHERE DOB >= '2018-10-01' AND DOB <= '2020-09-17';
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Para convertirlo en un rango exclusivo, use el mayor que (>
) operador y menor que (<
) operador.
SELECT * FROM Pets
WHERE DOB > '2018-10-01' AND DOB < '2020-09-17';
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 4 | 3 | 3 | Wag | 2020-03-15 | +---------+-------------+-----------+-----------+------------+
Si debe usar BETWEEN
operador, deberá reducir el rango en consecuencia.
Así:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-02' AND '2020-09-16';
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 4 | 3 | 3 | Wag | 2020-03-15 | +---------+-------------+-----------+-----------+------------+
Uso de valores numéricos
Los ejemplos anteriores usan fechas, pero no está limitado a solo fechas. Aquí hay un ejemplo que usa valores numéricos.
SELECT * FROM Pets
WHERE OwnerId BETWEEN 2 AND 3;
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 7 | 3 | 2 | Bark | NULL | +---------+-------------+-----------+-----------+------------+
Uso de valores de cadena
Podríamos ir un paso más allá y usar BETWEEN
para comparar dos columnas de cadenas.
SELECT * FROM Pets
WHERE PetName BETWEEN 'Meow' AND 'Wag'
ORDER BY PetName;
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 8 | 2 | 4 | Meow | NULL | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 4 | 3 | 3 | Wag | 2020-03-15 | +---------+-------------+-----------+-----------+------------+
Sin embargo, debes tener cuidado. Podrías pensar que podríamos usar la letra inicial, así:
SELECT * FROM Pets
WHERE PetName BETWEEN 'M' AND 'W'
ORDER BY PetName;
Pero eso resultará en esto:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 8 | 2 | 4 | Meow | NULL | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
No incluía Wag
como lo hizo la consulta anterior. Eso es porque BETWEEN
mira toda la cadena. En ese caso, Wag
es mayor que W
, por lo que no se incluye en los resultados.