Шаг 17 - Составные операторы в условии WHERE

Ранее мы рассматривали запросы из таблиц с применением простых условий поиска, но ограничиваться этим мы конечно же не станем, а рассмотрим так называемые "составные условия" поиска. То есть в операторе WHERE возможно применение нескольких условий поиска связанных между собой операторами OR, AND, NOT. Синтаксис этих операторов следующий:

Синтаксис операторов NOT, OR, AND.
(--------  WHERE -----------  УСЛОВИЕ -----------------)
                (--- NOT ---)
                (-------- AND -------------------------)
                (-------- OR --------------------------)

Рассмотрим несколько запросов созданных с помощью этих операторов.

Например: Найти служащих, у которых фактический обьем продаж меньше планового или меньше $300.00.

SQL> SELECT NAME, QUOTA, SALES
  2  FROM SALESREPS
  3  WHERE SALES < QUOTA OR SALES < 300.0
  4  /

NAME                               QUOTA     SALES
------------------------------ --------- ---------
Света Разина                         275   299,912
Наташа Королева                      200   142,594
Крис Кельми                         (NULL) 75,985
Дима Маликов                         275   286,775
Маша Сидорова                        300   186,042
Максим Галкин                        400    386,042

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

Получаем три столбца и шесть строк, которые возвращает оператор SELECT. OR дословно звучит как "ИЛИ"! То есть ИЛИ слева ИЛИ справа, ИЛИ и то и другое! Если не понятно, не углубляйтесь, ниже я все разьясню.

Найти служащих, у которых фактический обьем продаж меньше планового и меньше $300.00

SQL> SELECT NAME, QUOTA, SALES
  2  FROM SALESREPS
  3  WHERE SALES < QUOTA AND SALES < 300.0
  4/

NAME                               QUOTA     SALES
------------------------------ --------- ---------
Наташа Королева                      200   142,594
Маша Сидорова                        300   186,042

2 строки выбрано.

А вот здесь получаем три столбца и две строки которые вернул оператор SELECT. AND дословно звучит как "И"!

Найти служащих, у которых фактический обьем продаж меньше планового, но больше $150.00

SQL> SELECT NAME, QUOTA, SALES
  2 FROM SALESREPS
  3 WHERE (SALES < QUOTA) AND (NOT SALES > 150.000)
  4 /

NAME                               QUOTA     SALES
------------------------------ --------- ---------
Наташа Королева                      200   142,594

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

Здесь еще пример, с той лишь разницей что, теперь, используем оператор NOT. Дословно звучит как "НЕТ" или "НЕ" или "ТОЖЕ САМОЕ ТОЛЬКО НАОБОРОТ"!

С применением этих операторов можно строить, достаточно сложные условия поиска!

Например, вот такого вида: найти всех служащих которые, 1) Работают в "Запиндрищинске", "Красном мотоцикле" и "Чугуевске", или 2) не имеют менеджера и были приняты на работу после мая 1988 года или 3) превысили плановый обьем продаж, но не достигли $60.000.

Кому может понадобиться такое условие поиска, я себе смутно представляю, если только спецслужбам, но это просто пример! Кстати умение четко формулировать, суть искомой информации, поможет понять, как строить условие поиска!

SQL> SELECT NAME
  2  FROM SALESREPS
  3  WHERE (REP_OFFICE IN (22,11,12))
  4  OR (MANAGER IS NULL AND HIRE_DATE >= TO_DATE('01.05.88','DD/MM/YYYY'))
  5  OR (SALES > QUOTA AND NOT SALES > 60.0)
  6  /

NAME
------------------------------
Маша Распутина
Света Разина
Наташа Королева
Игорь Николаев
Дима Маликов
Маша Сидорова
Максим Галкин

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

Получаем один столбец и семь строк.

А вот теперь я думаю стало ясно, что такое AND, OR, NOT! По сути - это стандартные логические опрерации, которые подчиняются всем законам Булевой алгебры. Надеюсь, с ней вы знакомы и ничего нового для вас нет. Далее посмотрите на таблички, где так же фигурирует оператор NULL (я же предупреждал без него никуда!) и показано, что будет возвращать выражение, если слева и справа будут стоять, TRUE, FALSE, NULL.

Алгебра выражения AND.

   Значения     Результат
--------------  ----------	   
TRUE AND TRUE   -> TRUE
FALSE AND TRUE  -> FALSE
TRUE AND FALSE  -> FALSE
FALSE AND FALSE -> FALSE
NULL AND TRUE   -> NULL
TRUE AND NULL   -> NULL
FALSE AND NULL  -> FALSE
NULL AND FALSE  -> FALSE
NULL AND NULL   -> NULL

Алгебра выражения OR.

   Значения     Результат
--------------  ----------	   
TRUE OR TRUE    -> TRUE
FALSE OR TRUE   -> TRUE
TRUE OR FALSE   -> TRUE
FALSE OR FALSE  -> FALSE
NULL OR TRUE    -> TRUE
TRUE OR NULL    -> TRUE
FALSE OR NULL   -> NULL
NULL OR FALSE   -> NULL
NULL OR NULL    -> NULL

Алгебра выражения NOT.

   Значения     Результат
--------------  ----------	   
NOT TRUE        -> FALSE
NOT FALSE       -> TRUE
NOT NULL        -> NULL

Вот теперь, я надеюсь все неясности с составными операторами, должны остаться в прошлом. Да, чуть не забыл, все операторы составного поиска имеют каждый свой приоритет. Наивысший приоритет у NOT, за ним идет AND и замыкает OR! Вот именно для этого в запросе "для спецслужб" стоят "(" ")", с их помощью, можно строить выражение, так как вам нужно!

И еще кое что, сам SQL92 работает с знакомым нам оператором IS, с его помощью, так же можно проверить, будет ли выражение истинным, или ложным или не определенным. Его синтаксис, следующий:

Синтаксис оператора IS
--------- Сравнение ---------- IS (------ TRUE ---------------)
                                  (------ FALSE --------------)
--- Логическое выражение ---      (------ UNKNOWN ------------)

Например можно записать, следующее: ((SALES - QUOTA) > 100.000) IS UNKNOWN такое условие предполагает поиск строк, которые могут, быть не выбраны в следствии того, что столбец SALES или QUOTA, могут иметь значение NULL!

Такое условие еще как-то осмыслено, но вот например выражение: ((SALES - QUOTA) > 100.000) IS FALSE, вообще бессмыслено! Проще написать: NOT ((SALES - QUOTA) > 100.000) по этому в литературе, для обеспечения максимальной переносимости, не рекомендуется применять оператор IS в таком контексте, я например пробовал это все на Oracle, чего либо внятного к сожелению не получилось! :))) Вот такие события!


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