При роботі з реляційними СУБД, в яких дані зберігаються в табличному вигляді, користувачі часто стикаються із завданням вибірки значень, що входять (не входять) в певний діапазон. Мова SQL дозволяє задати безліч, яким має (не має) належати значення різними варіантами – оператором In, оператором Like комбінацією умов більше – менше, а також оператор Between. Опис і приклади в цій статті будуть присвячені останньому варіанту.
Оператор «Між» в SQL: синтаксис, обмеження
Дослівно оператор between SQL так і перекладається – «між». Його використання дозволяє задати обмеження «Від і До» до конкретного поля, і якщо чергове значення потрапить в діапазон, то предикат повертає значення «Істина», і значення потрапить в підсумкову вибірку.
Синтаксис оператора гранично простий:
Select * From table t1 Where t1.n between 0 and 7
Як бачимо, після ключового слова between необхідно вказати значення нижньої межі діапазону, потім AND і значення верхньої межі. Перерахуємо, з якими типами даних може працювати оператор between SQL: З числами – цілими і дробовими. З датами. З текстом. У даного оператора between SQL є певні особливості. Познайомимося з ними: При роботі з числами і датами значення обмежень «Від і До» включаються у вибірку. Значення нижньої межі діапазону повинно бути менше значення верхньої межі, інакше не буде виведено нічого, адже умова логічно не вірно. Особливо уважним треба бути, коли замість конкретних значень умова включаються змінні. При роботі з текстом значення верхньої межі діапазону не буде включено до вибірки, якщо воно не зазначено гранично точно. У наступних розділах розглянемо дану особливість докладніше.
Вибірка чисел і дат в певному діапазоні
Підготуємо таблицю з даними за менеджерам, які працюють в організації. Таблиця буде мати наступну структуру:
Ім'я поля
Тип даних
Опис
Код
Лічильник
Унікальний ідентифікатор співробітника
Прізвище
Текстовий
Прізвище співробітника
Ім'я
Текстовий
Ім'я співробітника
По батькові
Текстовий
По батькові співробітника
Підлогу
Текстовий
Стать співробітника (М/Ж)
Дата_приема
Дата/час
Дата прийому співробітника на роботу
Число_детей
Числовий
Кількість дітей у співробітника
Заповнимо таблицю наступними даними:
Код
Прізвище
Ім'я
По батькові
Підлогу
Дата_приема
Число_детей
1
Александрова
Ірина
Миколаївна
Ж
01052014
1
2
Боровий
Андрій
Степанович
М
21092013
0
3
Виноградов
Сергій
Павлович
М
15061998
1
4
Шумилін
Олександр
Борисович
М
25122004
2
5
Вишняков
Леонід
Олександрович
М
09102007
0
6
Тропников
Василь
Сергійович
М
12012016
3
7
Перел
Микита
Васильович
М
11012017
1
8
Авдєєва
Ніка
Костянтинівна
Ж
31032001
2
9
Яковлєв
Леонід
Миколайович
М
16022009
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 "А" і "В" ORDER BY 2
Результат наступний:
Код
Прізвище
Ім'я
По батькові
Підлогу
Дата_приема
Число_детей
8
Авдєєва
Ніка
Костянтинівна
Ж
31032001
2
1
Александрова
Ірина
Миколаївна
Ж
01052014
1
2
Боровий
Андрій
Степанович
М
21092013
0
Як бачимо, двоє співробітників, що мають прізвище на букву У, в список не потрапили. З чим це пов'язано? Справа в тому, яким саме чином оператор порівнює рядки нерівної довжини. Рядок «В» коротше рядка «Виноградів» і доповнюється пробілами. Але при сортуванні за алфавітом прогалини виявляться випереджаючими символами, і прізвище у вибірку не потрапить. Різні СУБД по-різному пропонують вирішувати цю проблему, але часто найпростіше для надійності вказувати наступну букву алфавіту в діапазоні:
SELECT Менеджери.* FROM Менеджери WHERE Менеджери.Прізвище between "А" і "Г" ORDER BY 2
При виконанні цього запиту результат нас повністю задовольнить.
Такий нюанс існує тільки при роботі з символьними даними, однак він показує, що при роботі навіть з такими простими операторами, як between, треба бути уважними.