Оператор BETWEEN (Transact-SQL)
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
test_expression
Выражение для проверки на принадлежность диапазону в пределах от begin_expression до end_expression. Выражение test_expression должно иметь тот же тип данных, что и begin_expression и end_expression.
Логическое НЕ
Указывает, что результат предиката должен быть инвертирован.
begin_expression
Любое допустимое выражение expression. Выражение begin_expression должно иметь тот же тип данных, что и test_expression и end_expression.
end_expression
Любое допустимое выражение expression. Выражение end_expression должно иметь тот же тип данных, что и test_expression и begin_expression.
И
Служит заполнителем, который указывает на то, что значение test_expression должно находиться в диапазоне от begin_expression до end_expression.
Типы результата
Boolean
Значение результата
Оператор BETWEEN возвращает значение TRUE, если значение аргумента test_expression больше значения аргумента begin_expression или равно ему и меньше значения аргумента end_expression или равно ему.
Оператор NOT BETWEEN возвращает значение TRUE, если значение аргумента test_expression меньше значения аргумента begin_expression или больше значения аргумента end_expression.
Замечания
Примеры
А. Использование оператора BETWEEN
В приведенном ниже примере возвращаются сведения о ролях базы данных. Первый запрос возвращает все роли. Во втором примере с помощью предложения BETWEEN роли ограничиваются указанными значениями database_id .
SELECT principal_id, name FROM sys.database_principals WHERE type = 'R'; SELECT principal_id, name FROM sys.database_principals WHERE type = 'R' AND principal_id BETWEEN 16385 AND 16390; GO
principal_id name ------------ ---- 0 public 16384 db_owner 16385 db_accessadmin 16386 db_securityadmin 16387 db_ddladmin 16389 db_backupoperator 16390 db_datareader 16391 db_datawriter 16392 db_denydatareader 16393 db_denydatawriter
principal_id name ------------ ---- 16385 db_accessadmin 16386 db_securityadmin 16387 db_ddladmin 16389 db_backupoperator 16390 db_datareader
B. Использование операторов > и < вместо BETWEEN
-- Uses AdventureWorks SELECT e.FirstName, e.LastName, ep.Rate FROM HumanResources.vEmployee e JOIN HumanResources.EmployeePayHistory ep ON e.BusinessEntityID = ep.BusinessEntityID WHERE ep.Rate > 27 AND ep.Rate < 30 ORDER BY ep.Rate; GO
FirstName LastName Rate --------- ------------------- --------- Paula Barreto de Mattos 27.1394 Janaina Bueno 27.4038 Dan Bacon 27.4038 Ramesh Meyyappan 27.4038 Karen Berg 27.4038 David Bradley 28.7500 Hazem Abolrous 28.8462 Ovidiu Cracium 28.8462 Rob Walters 29.8462
C. Использование оператора NOT BETWEEN
В следующем примере выводятся все строки вне указанного диапазона от 27 до 30 .
-- Uses AdventureWorks SELECT e.FirstName, e.LastName, ep.Rate FROM HumanResources.vEmployee e JOIN HumanResources.EmployeePayHistory ep ON e.BusinessEntityID = ep.BusinessEntityID WHERE ep.Rate NOT BETWEEN 27 AND 30 ORDER BY ep.Rate; GO
D. Использование оператора BETWEEN со значениями типа datetime
В приведенном ниже примере возвращаются строки, в которых значения типа datetime находятся между '20011212' и '20020105' включительно.
-- Uses AdventureWorks SELECT BusinessEntityID, RateChangeDate FROM HumanResources.EmployeePayHistory WHERE RateChangeDate BETWEEN '20011212' AND '20020105';
BusinessEntityID RateChangeDate ----------- ----------------------- 3 2001-12-12 00:00:00.000 4 2002-01-05 00:00:00.000
Запрос извлекает ожидаемые строки, так как значения даты в запросе и значения типа datetime, хранящиеся в столбце RateChangeDate , были заданы без указания времени. Если время не указано, по умолчанию оно принимается равным 0:00. Обратите внимание, что строка, время в которой позднее 0:00 05.01.2002, не будет возвращена данным запросом, так как она не попадает в диапазон.
Команда BETWEEN
Команда BETWEEN задает диапазон значений, по которому выбираются записи из базы данных. К примеру, можно выбрать записи для поля id от 3 до 10 -ти.
Синтаксис
SELECT * FROM имя_таблицы WHERE поле BETWEEN от AND до
Таблицы для примеров
| id айди |
name имя |
age возраст |
salary зарплата |
|---|---|---|---|
| 1 | user1 | 23 | 400 |
| 2 | user2 | 25 | 500 |
| 3 | user3 | 23 | 500 |
| 4 | user4 | 30 | 900 |
| 5 | user5 | 27 | 500 |
| 6 | user6 | 28 | 900 |
Пример
Давайте выберем записи с id от 2 -х до 4 -х включительно из таблицы:
SELECT * FROM employees WHERE id BETWEEN 2 AND 4
Результат выполнения кода:
| id айди |
name имя |
age возраст |
salary зарплата |
|---|---|---|---|
| 2 | user2 | 25 | 500 |
| 3 | user3 | 23 | 500 |
| 4 | user4 | 30 | 900 |
Пример
Можно комбинировать различные условия. К примеру, давайте выберем из таблицы записи с id от 2 -х до 4 -х включительно и чтобы при этом зарплата была 500 :
SELECT * FROM employees WHERE id BETWEEN 2 AND 4 AND salary=500
Результат выполнения кода:
| id айди |
name имя |
age возраст |
salary зарплата |
|---|---|---|---|
| 2 | user2 | 25 | 500 |
| 3 | user3 | 23 | 500 |
Пример
Диапазон можно делать не только по числовым значениям, но и по строковым. В следующем примере мы выберем из таблицы все записи с именами между 'user1' и 'user4' (сравнение идет в алфавитном порядке):
SELECT * FROM employees WHERE name BETWEEN 'user1' AND 'user4'
Результат выполнения кода:
| id айди |
name имя |
age возраст |
salary зарплата |
|---|---|---|---|
| 1 | user1 | 23 | 400 |
| 4 | user4 | 30 | 900 |
| 5 | user5 | 27 | 500 |
| 6 | user6 | 28 | 900 |
Смотрите также
- команду NOT ,
которая делает отрицание - команду IN ,
которая выбирает записи по указанным значениям
Фильтрация данных по диапазону — Основы SQL
Ранее в курсе мы уже научились работать с запросами, в которых данные фильтруются по диапазону значений. Например, мы умеем фильтровать записи по диапазону дат создания пользователя:
SELECT * FROM users WHERE created_at > '2022-06-13' AND created_at '2022-06-14';
Но есть одна сложность — такое условие неудобно читать и писать. Нам приходится дважды указывается одно и то же имя поля, поэтому есть вероятность допустить опечатку или ошибиться в операторах «больше» и «меньше». Для этой задачи можно использовать более удобный оператор — BETWEEN . В этом уроке мы изучим, как он работает.
Как фильтровать данные по диапазону
По сути, оператор BETWEEN — это сокращенная версия двух условий, соединенных через AND . Напишем запрос, который выбирает пользователей c датой рождения от 1 января до 1 февраля 2022 года:
SELECT * FROM users WHERE birthday > '2022-01-01' AND birthday '2022-02-01';
Теперь запишем диапазон дат через BETWEEN :
SELECT * FROM users WHERE birthday BETWEEN '2022-01-01' AND '2022-02-01';
Во втором запросе мы использовали BETWEEN . Обратите внимание, чем отличаются два этих запроса:
- В первом запросе крайние значения не входят в диапазон
- Во втором запросе — входят
Другими словами, эти два запроса не равнозначны. В первый диапазон не попадут пользователи с датой рождения 2022-01-01 или 2022-02-01 .
А теперь попробуем написать запрос, равнозначный запросу с BETWEEN . Для этого используем операторы сравнения:
- >= вместо >
- ⇐ вместо
SELECT * FROM users WHERE birthday >= '2022-01-01' AND birthday '2022-02-01';
Такой запрос будет полностью равнозначен запросу с BETWEEN .
Представим, что нам нужно выбрать все записи, которые НЕ попадают в диапазон. Тогда мы добавляем оператор NOT :
SELECT * FROM users WHERE birthday NOT BETWEEN '2022-01-01' AND '2022-02-01';
Такой запрос выведет всех пользователей, чьи даты рождения попадают в заданный диапазон — строго меньше 1 января или строго больше 1 февраля 2022 года.
SQL - Урок 2. Типы данных
Этот урок носит больше теоретический характер, но пропустить его нельзя. В дальнейшем вы сможете возвращаться к нему, как к справочному уроку, сейчас же просто ознакомьтесь. В прошлом уроке говорилось, что MySQL поддерживает числовые, строковые, календарные данные и данные типа NULL. Рассмотрим их по очереди.
Числовые типы данных
| Тип данных | Объем памяти | Диапазон | Описание |
| TINYINT (M) | 1 байт | от -128 до 127 или от 0 до 255 | Целое число. Может быть объявлено положительным с помощью ключевого слова UNSIGNED, тогда элементам столбца нельзя будет присвоить отрицательное значение. Необязательный параметр М - количество отводимых под число символов. Необязательный атрибут ZEROFILL позволяет свободные позиции по умолчанию заполнить нулями. |
TINYINT - хранит любое число в диапазоне от -128 до 127.
TINYINT UNSIGNED - хранит любое число в диапазоне от 0 до 255.
TINYINT (2) - предполагается, что значения будут двузначными, но по факту будет хранить и трехзначные.
SMALLINT - хранит любое число в диапазоне от -32768 до 32767.
SMALLINT UNSIGNED - хранит любое число в диапазоне от 0 до 65535.
SMALLINT (4) - предполагается, что значения будут четырехзначные, но по факту будет хранить и пятизначные.
MEDIUMINT - хранит любое число в диапазоне от -8388608 до 8388608.
MEDIUMINT UNSIGNED - хранит любое число в диапазоне от 0 до 16777215.
MEDIUMINT (4) - предполагается, что значения будут четырехзначные, но по факту будет хранить и семизначные.
INT - хранит любое число в диапазоне от -2147683648 до 2147683648.
INT UNSIGNED - хранит любое число в диапазоне от 0 до 4294967295.
INT (4) - предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные.
BIGINT - хранит любое число в диапазоне от -2 63 до 2 63 -1.
BIGINT UNSIGNED - хранит любое число в диапазоне от 0 до 2 64 .
BIGINT (4) - предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные.
Необходимо понимать, чем больше диапазон значений у типа данных, тем больше памяти он занимает. Поэтому, если предполагается, что значения в столбце не будут превышать 100, то используйте тип TINYINT. Если при этом все значения будут положительными, то используйте атрибут UNSIGNED. Правильный выбор типа данных позволяет сэкономить место для хранения этих данных.
Строковые типы данных
| Тип данных | Объем памяти | Максимальный размер | Описание |
| CHAR (M) | M символов | М символов | Позволяет хранить строку фиксированной длины М. Значение М - от 0 до 65535. |
Календарные типы данных
| Тип данных | Объем памяти | Диапазон | Описание |
| DATE | 3 байта | от '1000-01-01' до '9999-12-31' | Предназначен для хранения даты. В качестве первого значения указывается год в формате "YYYY", через дефис - месяц в формате "ММ", а затем день в формате "DD". В качестве разделителя может выступать не только дефис, а любой символ отличный от цифры. |
| TIME | 3 байта | от '-838:59:59' до '838:59:59' | Предназначен для хранения времени суток. Значение вводится и хранится в привычном формате - hh:mm:ss, где hh - часы, mm - минуты, ss - секунды. В качестве разделителя может выступать любой символ отличный от цифры. |
| DATATIME | 8 байт | от '1000-01-01 00:00:00' до '9999-12-31 23:59:59' | Предназначен для хранения и даты и времени суток. Значение вводится и хранится в формате - YYYY-MM-DD hh:mm:ss. В качестве разделителей могут выступать любые символы отличные от цифры. |
| TIMESTAMP | 4 байта | от '1970-01-01 00:00:00' до '2037-12-31 23:59:59' | Предназначен для хранения даты и времени суток в виде количества секунд, прошедших с полуночи 1 января 1970 года (начало эпохи UNIX). |
| YEAR (M) | 1 байт | от 1970 до 2069 для М=2 и от 1901 до 2155 для М=4 | Предназначен для хранения года. М - задает формат года. Например, YEAR (2) - 70, а YEAR (4) - 1970. Если параметр М не указан, то по умолчанию считается, что он равен 4. |
Тип данных NULL
Вообще-то это лишь условно можно назвать типом данных. По сути это скорее указатель возможности отсутствия значения. Например, когда вы регистрируетесь на каком-либо сайте, вам предлагается заполнить форму, в которой присутствуют, как обязательные, так и необязательные поля. Понятно, что регистрация пользователя невозможна без указания логина и пароля, а вот дату рождения и пол пользователь может указать по желанию. Для того, чтобы хранить такую информацию в БД и используют два значения:
NOT NULL (значение не может отсутствовать) для полей логин и пароль,
NULL (значение может отсутствовать) для полей дата рождения и пол.
По умолчанию всем столбцам присваивается тип NOT NULL, поэтому его можно явно не указывать.
create table users (login varchar(20), password varchar(15), sex enum('man', 'woman') NULL, date_birth date NULL);
Таким образом, мы создаем таблицу с 4 столбцами: логин (не более 20 символов) обязательное, пароль (не более 15 символов) обязательное, пол (мужской или женский) не обязательное, дата рождения (тип дата) необязательное.
Все, на этом урок, посвященный типам данных, закончен. У вас, возможно, остались вопросы, но они исчезнут по мере освоения дальнейшего материала, т.к. на практике все становится более понятно, чем в теории.
Онлайн-курс. Освойте востребованную профессию с зарплатой от 70 000 руб в месяц!
Теперь нажмите кнопку, что бы не забыть адрес и вернуться к нам снова.
