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:
- С числами – целыми и дробными.
- С датами.
- С текстом.
У данного оператора between SQL есть определенные особенности. Познакомимся с ними:
- При работе с числами и датами значения ограничений «От и До» включаются в выборку.
- Значение нижней границы диапазона должно быть меньше значения верхней границы, иначе не будет выведено ничего, ведь условие логически не верно. Особенно внимательным нужно быть, когда вместо конкретных значений в условие включаются переменные.
При работе с текстом значение верхней границы диапазона не будет включено в выборку, если оно не указано предельно точно. В следующих разделах рассмотрим данную особенность подробнее.
Выборка чисел и дат в определенном диапазоне
Подготовим таблицу с данными по менеджерам, работающим в организации. Таблица будет иметь следующую структуру:
Имя поля | Тип данных | Описание |
Код | Счетчик | Уникальный идентификатор сотрудника |
Фамилия | Текстовый | Фамилия сотрудника |
Имя | Текстовый | Имя сотрудника |
Отчество | Текстовый | Отчество сотрудника |
Пол | Текстовый | Пол сотрудника (М/Ж) |
Дата_приема | Дата/время | Дата приема сотрудника на работу |
Число_детей | Числовой | Количество детей у сотрудника |
Заполним таблицу следующими данными:
Код | Фамилия | Имя | Отчество | Пол | Дата_приема | Число_детей |
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, надо быть внимательными.