Between SQL: примеры, описание

При работе с реляционными СУБД, в которых данные хранятся в табличном виде, пользователи часто сталкиваются с задачей выборки значений, входящих (не входящих) в определенный диапазон. Язык SQL позволяет задать множество, которому должно (не должно) принадлежать значение различными вариантами – оператором In, оператором Like, комбинацией условий больше – меньше, а также оператором SQL Between. Описание и примеры в данной статье будут посвящены последнему варианту.

Оператор «Между» в SQL: синтаксис, ограничения

Дословно оператор between SQL так и переводится – «между». Его использование позволяет задать ограничение «От и До» к конкретному полю, и если очередное значение попадет в диапазон, то предикат примет значение «Истина», и значение попадет в итоговую выборку.

Синтаксис у оператора предельно простой:

Select *

From table t1

Where t1.n between 0 and 7

Как видим, после ключевого слова between необходимо указать значение нижней границы диапазона, затем AND и значение верхней границы.

Перечислим, с какими типами данных может работать оператор between SQL:

  1. С числами – целыми и дробными.
  2. С датами.
  3. С текстом.

У данного оператора between SQL есть определенные особенности. Познакомимся с ними:

  1. При работе с числами и датами значения ограничений «От и До» включаются в выборку.
  2. Значение нижней границы диапазона должно быть меньше значения верхней границы, иначе не будет выведено ничего, ведь условие логически не верно. Особенно внимательным нужно быть, когда вместо конкретных значений в условие включаются переменные.

При работе с текстом значение верхней границы диапазона не будет включено в выборку, если оно не указано предельно точно. В следующих разделах рассмотрим данную особенность подробнее.

Выборка чисел и дат в определенном диапазоне

Подготовим таблицу с данными по менеджерам, работающим в организации. Таблица будет иметь следующую структуру:

Имя поля

Тип данных

Описание

Код

Счетчик

Уникальный идентификатор сотрудника

Фамилия

Текстовый

Фамилия сотрудника

Имя

Текстовый

Имя сотрудника

Отчество

Текстовый

Отчество сотрудника

Пол

Текстовый

Пол сотрудника (М/Ж)

Дата_приема

Дата/время

Дата приема сотрудника на работу

Число_детей

Числовой

Количество детей у сотрудника

Заполним таблицу следующими данными:

Код

Фамилия

Имя

Отчество

Пол

Дата_приема

Число_детей

1

Александрова

Ирина

Николаевна

Ж

01.05.2014

1

2

Боровой

Андрей

Степанович

М

21.09.2013

0

3

Виноградов

Сергей

Павлович

М

15.06.1998

1

4

Шумилин

Александр

Борисович

М

25.12.2004

2

5

Вишняков

Леонид

Александрович

М

09.10.2007

0

6

Тропников

Василий

Сергеевич

М

12.01.2016

3

7

Жемчугов

Никита

Васильевич

М

11.01.2017

1

8

Авдеева

Ника

Константиновна

Ж

31.03.2001

2

9

Яковлев

Леонид

Николаевич

М

16.02.2009

0

Составим sql запрос between, который поможет нам выбрать всех сотрудников, имеющих 2 или 3 ребенка:

SELECT Менеджеры.*

FROM Менеджеры

WHERE Менеджеры.Число_детей between 2 and 3

Результатом станет три строки с данными по сотрудникам с фамилиями Шумилин, Тропников и Авдеева.

Теперь выберем сотрудников, принятых с 1 января 2005 года по 31 декабря 2016 года. Следует отметить, что разные СУБД по-разному позволяют записывать в условия даты. В большинстве случаев дату просто принудительно приводят к виду день-месяц-год (или как удобнее) и записывают в одинарные или двойные кавычки. В СУБД MS Access дату заключают в знак «#». Выполним пример как раз на ее основе:

SELECT Менеджеры.*, Менеджеры.Дата_приема

FROM Менеджеры

WHERE Менеджеры. Дата_приема Between #1/1/2005# And #31/12/2016#

Результатом станут пять сотрудников, принятых на работу в указанный период включительно.

Далее посмотрим, как работает between SQL со строками.

Работа в between со строками

Очень частая задача, которую приходится решать при работе с фамилиями сотрудников, – это необходимость выбрать только тех, чьи фамилии начинаются на определенную букву. Попробуем и мы выполнить запрос и выбрать сотрудников, чьи фамилии начинаются на фамилии с А до В:

SELECT Менеджеры.*

FROM Менеджеры

WHERE Менеджеры.Фамилия between "А" and "В"

ORDER BY 2

Результат следующий:

Код

Фамилия

Имя

Отчество

Пол

Дата_приема

Число_детей

8

Авдеева

Ника

Константиновна

Ж

31.03.2001

2

1

Александрова

Ирина

Николаевна

Ж

01.05.2014

1

2

Боровой

Андрей

Степанович

М

21.09.2013

0

Как видим, двое сотрудников, имеющих фамилию на букву В, в список не попали. С чем это связано? Дело в том, каким именно образом оператор сравнивает строки неравной длины. Строка «В» короче строки «Виноградов» и дополняется пробелами. Но при сортировке по алфавиту пробелы окажутся опережающими символами, и фамилия в выборку не попадет. Разные СУБД по-разному предлагают решать данную проблему, но зачастую проще всего для надежности указывать следующую букву алфавита в диапазоне:

SELECT Менеджеры.*

FROM Менеджеры

WHERE Менеджеры.Фамилия between "А" and "Г"

ORDER BY 2

При выполнении данного запроса результат нас полностью удовлетворит.

Такой нюанс существует только при работе с символьными данными, однако он показывает, что при работе даже с такими простыми операторами, как between, надо быть внимательными.

Комментарии