На что стоит обратить внимание, применяя оператор BETWEEN в SQL
В ходе работы с одной из БД, содержащих данные о транспортных средствах, возникла необходимость выгрузить модели автотранспорта, названия которых начинаются в диапазоне от «А» до «D».
Написав запрос на SQL, с помощью оператора BETWEEN, каково же было моё удивление, когда в результатах выгрузки не оказалось таких марок авто, как DATSUN и DAEWOO, которые точно были в базе данных.
Начав разбираться, я понял следующее — если Вам нужно применить оператор BETWEEN, который выбирает при запросе все значения из заданного диапазона (включая границы), то с датами и числовыми значениями не возникает трудностей, а вот с текстовыми строками всё иначе т.к. значение верхней границы диапазона не будет включено в выборку, если оно не указано точно.
Итак, у нас есть таблица “table1” со столбцом “model_car” (тип данных varchar) из которой нам необходимо вывести ее часть, где названия марок автомобилей лежат в диапазоне от А до D.
| ID | LAST_NAME | FIRST_NAME | MODEL_CAR | YEAR |
| 1 | Иванов | Петр | Audi | 2010 |
| 2 | Петров | Иван | BMW | 2015 |
| 3 | Сидоров | Василий | Dodge | 2017 |
| 4 | Алексеев | Олег | D | 2019 |
| 5 | Михайлов | Алексей | Chevrolet | 2012 |
| 6 | Петрова | Ольга | Jeep | 2015 |
| 7 | Иванова | Юлия | Volvo | 2016 |
| 8 | Лужин | Алексей | Mersedes | 2014 |
| 9 | Абрамов | Александр | Ford | 2017 |
| 10 | Семенов | Семен | Datsun | 2017 |
Если выполнить следующий запрос:
То результат его выполнения будет следующим:
| ID | LAST_NAME | FIRST_NAME | MODEL_CAR | YEAR |
| 1 | Иванов | Петр | Audi | 2010 |
| 2 | Петров | Иван | BMW | 2015 |
| 5 | Михайлов | Алексей | Chevrolet | 2012 |
| 4 | Алексеев | Олег | D | 2019 |
Как видно из примера, выведены только значения, начинающиеся с А до С, за исключением строчки, где значение равно D.
Дело в том, что так оператор BETWEEN сравнивает строки неравной длины. Строка “D” короче строки “Dodge” и, при сравнении, дополняется пробелами. Но при сортировке по алфавиту пробелы окажутся опережающими символами и поэтому строка в выборку не попадает.
Выражение “Имя” BETWEEN ‘A’ AND ‘D’ эквивалентно “имя” >= ‘A’ AND “имя” = ‘A’ AND ‘D’.
Чтобы получить все строки, начинающиеся от А до D включительно, то необходимо было в запросе написать так:
| ID | LAST_NAME | FIRST_NAME | MODEL_CAR | YEAR |
| 1 | Иванов | Петр | Audi | 2010 |
| 2 | Петров | Иван | BMW | 2015 |
| 5 | Михайлов | Алексей | Chevrolet | 2012 |
| 4 | Алексеев | Олег | D | 2019 |
| 10 | Семенов | Семен | Datsun | 2017 |
| 3 | Сидоров | Василий | Dodge | 2017 |
Такой нюанс существует только при работе с символьными данными, поэтому нужно быть внимательным, даже при работе с таким простым оператором, как BETWEEN.
SQL — универсальный язык, поэтому нашу задачу можно было выполнить другими способами:
Какой запрос выбрать, для обработки подобных данных, решать только вам. В свою очередь, искренне надеюсь, что мои советы помогут в решении поставленной задачи.
Оператор BETWEEN в SQL.
Всем привет! Сегодня мы поговорим про оператор between, позволяющий выбрать некоторый диапазон.
К примеру, у нас есть таблица с такими полями:
Уникальный идентификатор, название товара и его цена.
Теперь представим, что нам нужно выбрать товары, у которых цена от 10 до 30 рублей. Как мы это можем сделать? Ну, например, вот так:
SELECT * FROM products WHERE price > 10 AND price
Но, однако, это не самое лучшее решение. На помощь нам приходит оператор BETWEEN.
SELECT * FROM products WHERE price BETWEEN 10 AND 30;
Данный оператор может работать как с числами, так и с текстами и датами.
SELECT * FROM table WHERE date BETWEEN ‘2014-01-01’ AND ‘2014-03-01’;
Если вам, к примеру, нужно выбрать все товары, у которых цена не находится в каком-то диапазоне, то используйте NOT.
SELECT * FROM products WHERE price NOT BETWEEN 10 AND 30;
Используйте этот оператор, где это необходимо. Спасибо за внимание!
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 3 ):
А что, этот оператор модифицирует строки ‘2014-01-01’ и ‘2014-03-01’ в таймстампы? И выбирает диапазон уже между таймстампами? Или как это он выбирает диапазон между строками? Он же не знает, что это на самом деле даты.
есть поле такое в базе данных, которое выводит дату в таком формате: YYYY-MM-DD Так что он все прекрасно знает.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
BETWEEN (Transact-SQL)
Specifies a range to test.

Syntax
To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
Arguments
test_expression
Is the expression to test for in the range defined by begin_expressionand end_expression. test_expression must be the same data type as both begin_expression and end_expression.
NOT
Specifies that the result of the predicate be negated.
begin_expression
Is any valid expression. begin_expression must be the same data type as both test_expression and end_expression.
end_expression
Is any valid expression. end_expression must be the same data type as both test_expressionand begin_expression.
AND
Acts as a placeholder that indicates test_expression should be within the range indicated by begin_expression and end_expression.
Result Types
Boolean
Result Value
BETWEEN returns TRUE if the value of test_expression is greater than or equal to the value of begin_expression and less than or equal to the value of end_expression.
NOT BETWEEN returns TRUE if the value of test_expression is less than the value of begin_expression or greater than the value of end_expression.
Remarks
To specify an exclusive range, use the greater than (>) and less than operators ( BETWEEN clause to limit the roles to the specified database_id values.
Here is the result set.
B. Using > and > ) and less than ( ) operators and, because these operators are not inclusive, returns nine rows instead of ten that were returned in the previous example.
Here is the result set.
C. Using NOT BETWEEN
D. Using BETWEEN with datetime values
С помощью предиката SQL BETWEEN можно извлечь из таблицы строки, в которых значения некоторого проверяемого столбца находятся в интервале, границы которого обозначены некоторым выражением. Границы интервала также включены в него.
Запросы с предикатом SQL BETWEEN имеют следующий синтаксис:
Если перед предикатом BETWEEN поставить ключевое слово NOT, то в выборку попадут строки, в которых значение проверяемого столбца находится за пределами интервала: до ВЫРАЖЕНИЯ_1 и после ВЫРАЖЕНИЯ_2.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке .
Запросы с BETWEEN: интервал задан указанными числами
В самых простых запросах с предикатом BETWEEN границы интервала для проверяемого столбца заданы непосредственным указанием числовых значений.
Пример 1. Итак, работаем с базой данных фирмы и её таблицей Staff, содержащей данные о заработной плате сотрудников.
| ID | Name | Salary |
| 1 | Sanders | 18357.5 |
| 2 | Pernal | 15430.0 |
| 3 | Marenghi | 17506.8 |
| 4 | Doctor | 12322.4 |
| 5 | Factor | 16228.7 |
| 6 | Junkers | 16232.8 |
| 7 | Moonlight | 21500.6 |
| 8 | Aisen | 19540.7 |
| 9 | MacGregor | 15790.8 |
Требуется вывести сотрудников, заработная плата которых находится в интервале от 16 000 до 18 000. Пишем следующий запрос с предикатом BETWEEN:
Запрос выведет следующую результирующую таблицу:
| ID | Name | Salary |
| 3 | Marenghi | 17506.8 |
| 5 | Factor | 16228.7 |
| 6 | Junkers | 16232.8 |
Запрос выведет следующую результирующую таблицу:
| ID | Name | Salary |
| 1 | Sanders | 18357.5 |
| 2 | Pernal | 15430.0 |
| 4 | Doctor | 12322.4 |
| 7 | Moonlight | 21500.6 |
| 8 | Aisen | 19540.7 |
| 9 | MacGregor | 15790.8 |
Запросы с BETWEEN: интервал задан вложенными запросами
В запросах с BETWEEN границы интервала для проверяемого столбца можно не указывать явно, задав его некоторыми условиями, которые определены вложенными запросами.
Пример 3. Продолжаем работать с базой данных Staff. Требуется вывести сотрудников, заработная плата которых находится в интервале между средней и максимальной. Пишем следующий запрос, в котором границы заданы вложенными запросами:
Результатом выполнения запроса будет следующая таблица:
| ID | Name | Salary |
| 1 | Sanders | 18357.5 |
| 3 | Marenghi | 17506.8 |
| 7 | Moonlight | 21500.6 |
| 8 | Aisen | 19540.7 |
Результатом выполнения запроса будет следующая таблица:
| ID | Name | Salary |
| 3 | Marenghi | 17506.8 |
| 5 | Factor | 16228.7 |
| 6 | Junkers | 16232.8 |
| 9 | MacGregor | 15790.8 |
Как видим, граничные значения интервала попали в результирующую таблицу.
Написать запрос с предикатом BETWEEN самостоятельно, а затем посмотреть решение
Пример 5. Продолжаем работать с таблицей Staff. Требуется вывести сотрудников с ID между ID сотрудника Marenghi и ID сотрудника Moonlight.
Запросы с BETWEEN: интервал задан значениями даты и времени
Интервал для извлечения строк с помощью предиката BETWEEN может быть задан не только значениями числового типа данных, но и значениями даты и времени.
Пример 6. Итак, работаем с базой данных «Недвижимость».
Таблица Deal содержит данные о сделках. Нам потребуется столбец Date, в котором указывается дата совершения сделки. Для упрощения будем считать, что в таблице представлены сделки, заключённые в течение одного года. Требуется вывести сделки, заключённые в августе и сентябре. Пишем следующий запрос:
Примеры запросов к базе данных «Недвижимость» есть также в уроках по оператору GROUP BY, предикату EXISTS, функциям ALL и ANY и LIMIT.
SQL BETWEEN Оператор
SQL BETWEEN оператор
Оператор «BETWEEN» выбирает значения в пределах заданного диапазона. Значения могут быть числами, текстом или датами.
Между оператором включительно: начинаются и заканчиваются значения включены.
Между синтаксисом
Демонстрационная база данных
Ниже приведен выбор из таблицы «Products» в образце базы данных Northwind:
BETWEEN Пример
Следующая инструкция SQL выбирает все продукты с ценой от 10 до 20:
Пример
NOT BETWEEN Пример
Для отображения продуктов за пределами диапазона предыдущего примера используйте не между:
Пример
BETWEEN С IN Пример
Следующая инструкция SQL выбирает все продукты с ценой от 10 до 20. Кроме того; не показывать продукты с CategoryID 1, 2 или 3:
Пример
BETWEEN Text Values Пример
Следующая инструкция SQL выбирает все продукты с марка между «Карнарвон тигров» и «Моцарелла ди Джованни»:
Пример
NOT BETWEEN Text Values Пример
Следующая инструкция SQL выбирает все продукты с марка не между «Карнарвон тигров» и «Моцарелла ди Джованни»:
Пример
Пример таблицы
Ниже приведен выбор из таблицы «Orders» в образце базы данных Northwind:
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10248 | 90 | 5 | 7/4/1996 | 3 |
| 10249 | 81 | 6 | 7/5/1996 | 1 |
| 10250 | 34 | 4 | 7/8/1996 | 2 |
| 10251 | 84 | 3 | 7/9/1996 | 1 |
| 10252 | 76 | 4 | 7/10/1996 | 2 |
BETWEEN Dates Example
The following SQL statement selects all orders with an OrderDate BETWEEN ’04-July-1996′ and ’09-July-1996′:






