SQL/BETWEEN

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

BETWEEN (ru между) — оператор языка SQL задающий некий диапазон (промежуток) значений.

В нём указывается диапазон вхождений значения. Диапазон разделяется ключевым словом AND.

Пример использования SQL оператора BETWEEN

SELECT `roomNumber` FROM `classes` WHERE `number` BETWEEN 200 AND 400;

В данном примере вытащатся все строки со столбцами roomNumber из таблицы classes, где значение столбца number входит в диапазон значений между 200 и 400 (включительно).

Подробнее про оператор BETWEEN

Оператор BETWEEN похож на оператор IN. В отличии от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение.

В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку. (Обратите Внимание что, в отличие от Английского языка, SQL не говорит что "значение находится (между)BETWEEN значением и значением", а просто "значение BETWEEN значение значение". Это применимо и к оператору LIKE).

Следующий пример будет извлекать из таблицы Продавцов всех продавцов с комиссионными между .10 и .12:

 
          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   | 
            ============================================= 

SQL не делает непосредственной поддержки невключения BETWEEN. Вы должны или определить ваши граничные значения так, чтобы включающая интерпретация была приемлема, или сделать что-нибудь типа этого:

 
      SELECT * 
          FROM Salespeople 
          WHERE ( comm BETWEEN .10, AND .12 ) 
            AND NOT comm IN ( .10, .12 ); 

          ===============  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   | 
          |                                               | 
           =============================================== 

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

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

Этот запрос выбирает всех заказчиков чьи имена попали в определенный алфавитный диапазон:

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

           ===============  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   | 
          |                                               | 
            ============================================= 

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