Шаг 14 - Оператор BETWEEN и IN

Итак, идем дальше, рассмотрим выражение BETWEEN, по своей сути это выражение проверки на принадлежность к диапазону значений. Синтаксис выражения строится примерно так:

--- поверяемое выражение -------  BETWEEN ----- нижнее выражение AND верхнее выражение
                         - NOT -

Выражение NOT обуславливает обратное инвертирование условия, то есть "не принадлежит".

Давайте попробуем применить, на практике, запускайте SQL Plus и вводите: Найти все заказы, сделанные в последнем квартале 1989г.

SQL> SELECT ORDER_NUM, ORDER_DATE, MFR, PRODUCT, AMOUNT
  2  FROM ORDERS
  3  WHERE ORDER_DATE BETWEEN TO_DATE('01.11.1989','DD/MM/YYYY') AND TO_DATE('31.12.1989','DD/MM/YYYY')
  4  /

ORDER_NUM ORDER_DA MFR PRODU    AMOUNT
--------- -------- --- ----- ---------
   112961 17.12.89 REI 2A44L      31,5
   112963 17.12.89 ACI 41004     3,276
   112983 27.12.89 ACI 41004       702
   112922 04.11.89 ACI 41002       760
   112987 31.12.89 ACI 4100Y      27,5

Так работает с датами, выражение TO_DATE и есть преобразование строк!

Идем дальше: Найти заказы, стоимость которых попадают в различные диапазоны.

SQL> SELECT ORDER_NUM, AMOUNT
  2  FROM ORDERS
  3  WHERE  AMOUNT BETWEEN 20.000  AND 29.999
  4  /

ORDER_NUM    AMOUNT
--------- ---------
   113036      22,5
   112987      27,5
   113042      22,5

SQL> SELECT ORDER_NUM, AMOUNT
  2  FROM ORDERS
  3  WHERE  AMOUNT BETWEEN 30.000  AND 39.999
  4  /

ORDER_NUM    AMOUNT
--------- ---------
   112961      31,5
   113069     31,35

SQL> SELECT ORDER_NUM, AMOUNT
  2  FROM ORDERS
  3  WHERE  AMOUNT BETWEEN 1.000  AND 9.999
  4  /

ORDER_NUM    AMOUNT
--------- ---------
   113012     3,745
   112989     1,458
   113051      1,42
   112968     3,978
   112963     3,276
   113058     1,478
   113024       7,1
   113062      2,43
   113027     4,104
   113007     2,925
   112975       2,1
   113048      3,75
   112993     1,896
   113065      2,13
   113003     5,625

15 строк выбрано.

Так проверяем простое соответствие числовому диапазону.

Идем дальше. Можно так же с помощью выражения NOT проверить на вхождение в данный диапазон значений, например: Вывести список служащих, фактические объемы продаж которых не попадает в диапазон, от 80 до 120 процентов плана.

SQL> SELECT NAME, SALES, QUOTA
  2  FROM SALESREPS
  3  WHERE SALES NOT BETWEEN (0.8 * QUOTA)  AND (1.2 * QUOTA)
  4  /

NAME                               SALES     QUOTA
------------------------------ --------- ---------
Маша Распутина                   392,725       300
Филип Киркоров                    474,05       350
Наташа Королева                  142,594       200
Маша Сидорова                    186,042       300

Заметили что, напоминает BETWEEN, да вот такое выражение:

.... (!(SALES >= (0.8 * QUOTA))  AND (SALES <= (1.2 * QUOTA)))

Хотя BETWEEN конечно нагляднее и понятнее, как мне кажется!

Теперь попробуем разобраться с выражением IN. Выражение IN это проверка на принадлежность множеству значений или, иначе говоря, членство в множестве, (фу слова какие не приглядные :)))) Синтаксис команды таков:

--- поверяемое выражение -------  IN ----- (-- const -----------)
                         - NOT -            -- , ---------------

Лучше всего, конечно, пробовать ручками по этому проделаем несколько примеров с нашими учебными табличками: Вывести список служащих, которые работают в Запиндрищенске, Красном-мотоцикле или Бубурино.

SQL> SELECT NAME, QUOTA, SALES
  2  FROM SALESREPS
  3  WHERE REP_OFFICE IN (11, 13, 22)
  4  /

NAME                               QUOTA     SALES
------------------------------ --------- ---------
Вася Пупкин                          350   367,911
Маша Распутина                       300   392,725
Света Разина                         275   299,912
Маша Сидорова                        300   186,042

Вот такие данные получаем.

Найти все заказы, сделанные в разные дни июня месяца 1990 года.

SQL> SELECT ORDER_NUM, ORDER_DATE, AMOUNT
  2  FROM ORDERS
  3  WHERE ORDER_DATE IN (TO_DATE('14.06.1990','DD/MM/YYYY'), TO_DATE('08.06.1990','DD/MM/YYYY'),
  4  TO_DATE('29.06.1990','DD/MM/YYYY'), TO_DATE('04.06.1990','DD/MM/YYYY'))
  5  /

ORDER_NUM ORDER_DA    AMOUNT
--------- -------- ---------
   113013 14.06.90       652
   112997 08.06.90       652
   113007 08.06.90     2,925
   113034 29.06.90       632

Вот так работает с датами.

Найти все заказы полученные четырьмя конкретными служащими.

SQL> SELECT ORDER_NUM, REP, AMOUNT
  2  FROM ORDERS
  3  WHERE REP IN (107, 109, 101, 103)
  4  /

ORDER_NUM       REP    AMOUNT
--------- --------- ---------
   112968       101     3,978
   113058       109     1,478
   112997       107       652
   113062       107      2,43
   113069       107     31,35
   112975       103       2,1
   113055       101       150
   113003       109     5,625
   113057       103    600,34
   113042       101      22,5

10 строк выбрано.

Вот так работает числовой диапазон. С помощью NOT IN можно проверить на "не принадлежность" диапазону. В своей сути IN это примерно эквивалентно: .....(REP = 107) OR (REP = 109) OR (REP = 101) OR (REP = 103) хотя, конечно же .....REP IN (107, 109, 101, 103) нагляднее и читается гораздо лучше. Так же следует избегать чего-то вроде NAME IN ('Филип Киркоров') вследствие того, что выражение NAME = 'Филип Киркоров' гораздо проще и понятнее, по этому не нужно терять чувство реальности! Вот пока все, в следующий раз продолжим!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 10.08.03