W SQL BETWEEN
Operator umożliwia sprawdzenie wartości mieszczących się w danym zakresie.
BETWEEN
operator określa zakres do przetestowania i zwraca TRUE
gdy operand znajduje się w zakresie porównań.
Tabela źródłowa
Poniższa tabela jest używana jako przykłady na tej stronie.
SELECT * FROM Pets;
Wynik:
+---------+-------------+-----------+-----------+------------+ | 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)
Przykład
Oto prosty przykład demonstrujący BETWEEN
operatora.
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';
Wynik:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
W tym przykładzie zwróciliśmy wszystkie wiersze, w których DOB
kolumna była między 2018-10-01
i 2020-09-17
.
W tym przypadku cztery wiersze spełniały te kryteria, a zatem zostały zwrócone cztery wiersze.
BETWEEN obejmuje
BETWEEN
operator. jest inkluzywny. Oznacza to, że zawiera wartości na każdym końcu zakresu. Jeśli spojrzysz na wyniki w poprzednim przykładzie, zobaczysz, że na obu końcach znajdują się wartości, które dokładnie pasują do podanych przez nas dat.
To to samo, co użycie operatora większe lub równe (>=
) w połączeniu z operatorem mniejszym lub równym (<=
).
SELECT * FROM Pets
WHERE DOB >= '2018-10-01' AND DOB <= '2020-09-17';
Wynik:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Aby uczynić go zakresem wyłącznym, użyj większej niż (>
) operator i mniej niż (<
).
SELECT * FROM Pets
WHERE DOB > '2018-10-01' AND DOB < '2020-09-17';
Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 4 | 3 | 3 | Wag | 2020-03-15 | +---------+-------------+-----------+-----------+------------+
Jeśli musisz użyć BETWEEN
operatora, musisz odpowiednio zawęzić zakres.
Tak:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-02' AND '2020-09-16';
Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 4 | 3 | 3 | Wag | 2020-03-15 | +---------+-------------+-----------+-----------+------------+
Korzystanie z wartości liczbowych
W poprzednich przykładach użyto dat, ale nie ograniczasz się tylko do dat. Oto przykład wykorzystujący wartości liczbowe.
SELECT * FROM Pets
WHERE OwnerId BETWEEN 2 AND 3;
Wynik:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Korzystanie z wartości ciągów
Możemy pójść o krok dalej i użyć BETWEEN
aby porównać dwie kolumny ciągów.
SELECT * FROM Pets
WHERE PetName BETWEEN 'Meow' AND 'Wag'
ORDER BY PetName;
Wynik:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Musisz jednak być ostrożny. Możesz pomyśleć, że moglibyśmy użyć pierwszej litery, takiej jak ta:
SELECT * FROM Pets
WHERE PetName BETWEEN 'M' AND 'W'
ORDER BY PetName;
Ale to spowoduje to:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 8 | 2 | 4 | Meow | NULL | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Nie zawierał Wag
tak jak poprzednie zapytanie. To dlatego, że BETWEEN
patrzy na cały ciąg. W takim przypadku Wag
jest większe niż W
, więc nie jest uwzględniany w wynikach.