ОПЕРАТОР BETWEEN
Оператор BETWEEN похож на оператор IN. В отличии от определения по номерам из набора,
как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат
верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение.
В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по
алфавитному или числовому порядку. Следующий пример будет извлекать из таблицы Продавцов всех продавцов
с комиссионными между .10 и .12 (вывод показывается в Рисунке 5.4):
SELECT * FROM Salespeople WHERE comm BETWEEN .10 AND .12;
Для включенного оператора BETWEEN, значение
совпадающее с любым из двух значений границы ( в этом случае, .10 и .12 ) заставляет предикат быть верным.
snum |
sname |
city |
comm |
1001 |
Peel |
London |
0.12 |
1004 |
Motika |
London |
0.11 |
1003 |
Axelrod |
New York |
0.10 |
Рисунок 5.4: SELECT использует BETWEEN
SQL не делает непосредственной поддержки невключения BETWEEN. Вы
должны или определить ваши граничные значения так, чтобы включающая интерпретация была приемлема, или сделать
что-нибудь типа этого:
SELECT * FROM Salespeople WHERE ( comm BETWEEN .10, AND .12 ) AND NOT comm IN ( .10, .12 );
Вывод для этого запроса показывается в Рисунке 5.5. BETWEEN может работать с символьными полями в терминах
эквивалентов ASCII. Это означает что вы мо- жете использовать BETWEEN чтобы выбирать ряд значений из
упорядоченных по алфавиту значений.
SELECT * FROM Salespeople WHERE ( comm BETWEEN .10 AND .12 AND NOT comm IN ( .10 .12);
snum |
sname |
city |
comm |
1004 |
Motika |
London |
0.11 |
Рисунок 5.5: Сделать BETWEEN -невключенным
Этот запрос выбирает всех заказчиков чьи имена попали в определенный алфавитный диапазон:
SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G'; Вывод для этого запроса показывается в Рисунке 5.6.
Обратите Внимание что Grass и Giovanni отсутствуют, даже при включенном BETWEEN. Это происходит из-за того
что BETWEEN сравнивает строки неравной длины. Строка 'G' более короткая чем строка Giovanni, поэтому BETWEEN
выводит 'G' с пробелами. Пробелы предшествуют символам в алфавитном порядке ( в большинстве реализаций ),
поэтому Giovanni не выбирается. То же самое происходит с Grass. Важно помнить это когда вы используете BETWEEN
для извлечения значений из алфавитных диапазонов. Обычно вы указываете диапазон с помощью символа начала
диапазона и символа конца( вместо которого можно просто поставить z ).
SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G';
cnum |
cname |
city |
rating |
snum |
2006 |
Clemens |
London |
100 |
1001 |
2008 |
Cisneros |
San Jose |
300 |
1007 |
Рисунок 5. 6: Использование BETWEEN в алфавитных порядках