Итак, идем дальше, рассмотрим выражение 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 = 'Филип Киркоров' гораздо проще и понятнее, по этому не нужно терять чувство реальности! Вот пока все, в следующий раз продолжим!