Ранее мы рассматривали запросы из таблиц с применением простых условий поиска, но ограничиваться этим мы конечно же не станем, а рассмотрим так называемые "составные условия" поиска. То есть в операторе 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, чего либо внятного к сожелению не получилось! :))) Вот такие события!