Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
М. ГРУБЕР_SQL.doc
Скачиваний:
22
Добавлен:
18.04.2019
Размер:
1.4 Mб
Скачать

Оператор between

Оператор BETWEEN похож на оператор IN. В отличие от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться, что делает предикат верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым в алфавитном или числовом порядке. Обратите внимание, что, в отличие от английского языка, SQL не говорит "значение находится между (BETWEEN) значением и значением”, а просто "значение BETWEEN значение AND значение”. Это применимо и к оператору LIKE (см. ниже). Следующий пример будет извлекать из таблицы Продавцов всех продавцов с комиссионными между .10 и .12 (вывод показывается в Рисунке 5.4):

SELECT * FROM Salespeople WHERE comm BETWEEN .10 AND .12;

Для включенного оператора BETWEEN, значение совпадающее с любым из двух значений границы (в этом случае, .10 и .12) заставляет предикат быть верным.

=============== SQL Execution Log ============ | SELECT * | | FROM Salespeople | | WHERE comm BETWEEN .10 AND .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.

=============== SQL Execution Log ============ | 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 — невключающим

По общему признанию, это немного неуклюже, но зато показывает, как эти новые операторы могут комбинироваться с операторами Буля, чтобы производить более сложные предикаты. В основном, вы используете IN и BETWEEN так же, как вы использовали реляционные операторы, чтобы сравнивать значения, которые берутся либо из набора (для IN) либо из диапазона (для BETWEEN).

Также, подобно реляционным операторам, BETWEEN может работать с символьными полями. Это означает, что вы можете использовать BETWEEN, чтобы выбирать ряд значений из упорядоченных по алфавиту значений.

Этот запрос выбирает всех заказчиков, чьи имена попали в диапазон от 'A' до 'G':

SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G';

Вывод для этого запроса показывается в Рисунке 5.6.

=============== SQL Execution Log ============ | 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 в алфавитном порядке.

Обратите внимание, что Grass и Giovanni отсутствуют. Это происходит из-за того, что BETWEEN сравнивает строки неравной длины. Строка 'G' более короткая, чем строка 'Giovanni', поэтому BETWEEN выводит 'G' с пробелами. Пробелы предшествуют символам в алфавитном порядке (в большинстве реализаций), поэтому 'Giovanni' не выбирается. То же самое происходит с Grass. Важно помнить это, когда вы используете BETWEEN для извлечения значений из алфавитных полей. Обычно вы указываете диапазон с помощью символа начала диапазона и символа конца (вместо которого можно просто поставить ‘z’).