Программирование >>  Sql: полное руководство 

1 ... 32 33 34 [ 35 ] 36 37 38 ... 264


имя столбца IS

I-NOT-J

NULL

Рис 6 11 Синтаксическая диаграмма*проверкина раввнстзо знаШнию NULLf-(оператору XS NULL) ,4

В следующем запросе проверка на null используется для нахождения в учебной базе данных служащего, который еще не был закреплен за офисом:

Найти служащего, который еще не закреплен за офисом.

SELECT NAME

FROM SALESREPS WHERE REP OFFICE IS NULL

NAME

Tom Snyder

Инвертированная форма проверки на null (is not null) позволяет отыскать строки, которые не содержат значений null:

Вывести список служащих, которые уже закреплены за офисами.

SELECT NAME

FROM SALESREPS WHERE REP OFFICE IS NOT NULL

NAME

Bill Adams Mary Jones Sue Smith Sam Clark Bob Smith Dan Roberts Larry Fitch Paul Cruz Nancy Angelli

В отличие от условий отбора, описанных выще, проверка на null не может возвратить значение null в качестве результата. Она всегда возвращает true или false

Может показаться странным, что нельзя проверить значение на равенство null с помощью операции сравнения, например-

SELECT NAME

FROM SALESREPS WHERE REP OFFICE = NULL

Ключевое слово null здесь нельзя использовать, поскольку на самом деле это не настоящее значение; это просто сигнал о том, что значение неизвестно. Даже если бы сравнение

REP OFFICE = NULL



было возможно, правила обработки значений null в сравнениях привели бы к тому, что оно вело бы себя не так, как ожидается. Если бы СУБД обнаружила строку, в которой столбец rep office содержит значение null, выполнилась бы следующая проверка:

NULL = NULL

Что будет результатом этого сравнения: true или false? Так как значения по обе стороны знака равенства неизвестны, то, в соответствии с правилами логики SQL, условие отбора должно вернуть значение null. Поскольку условие отбора возвращает результат, отличный от true, строка исключается из таблицы результатов запроса - это противоположно тому, к чему вы стремились! Из-за правил обработки значений null в SQL необходимо использовать проверку is null.

Составные условия отбора (операторы AND, OR и NOT)

Простые условия отбора, описанные в предыдущих параграфах, после применения к некоторой строке возвращают значения true, false или null. С помощью правил логики эти простые условия можно объединять в более сложные, как изображено на рис. 6.12. Обратите внимание на то, что условия отбора, объединенные с помощью операторов and, or и not, сами могут быть составными.

- WHERE

L-NOT-J

- условие отбора

-т- AND-1- OR -

Рис. 6.12. СнтшЗчвасая д1 ]грат*а предложения 4ш

Оператор or используется для объединения двух условий отбора, из которых как минимум одно должно быть истинным:

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

SELECT NAME, QUOTA, SALES FROM SALESREPS WHERE SALES < QUOTA

OR SALES < 300000.00

NAME QUOTA SALES

Sam Clark $275,000.00 $299,912.00

Bob Smith $200,000.00 $142,594.00

Tom Snyder NULL $75,985.00

Paul Cruz $275,000.00 $286,775.00

Nancy Angelli $300,000.00 $186,042.00



Для объединения двух условий отбора, оба из которых должны быть истинными, следует использовать оператор and:

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

SELECT NAME, QUOTA, SALES FROM SALESREPS WHERE SALES < QUOTA

AND SALES < 300000.00

NAME QUOTA SALES

Bob Smith $200,000.00 $142,594.00

Nancy Angelli $300,000.00 $186,042.00

И наконец, можно использовать оператор not, чтобы выбрать строки, для которых условие отбора ложно:

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

SELECT NAME, QUOTA, SALES FROM SALESREPS WHERE SALES < QUOTA

AND NOT SALES < 150000.00

NAME QUOTA SALES

Nancy Angelli $300,000.00 $186,042.00

С помощью логических операторов and, or и not и круглых скобок можно создавать очень сложные условия отбора, как в следующем примере:

Найти всех служащих, которые: (а) работают в Денвере, Нью-Йорке или Чикаго; или (б) не имеют менеджера и были приняты на работу после июня 1988; или (с) превысили плановый объем продаж, но не достигли уровня в $600000.

SELECT NAME

FROM SALESREPS WHERE {REP OFFICE IN (22, 11, 12))

OR (MANAGER IS NULL AND HIRE DATE >= Ol-JUN-88) OR (SALES > QUOTA AND NOT SALES > 600000.00)

Вряд ли вам может понадобиться такой список имен, однако приведенный пример является иллюстрацией довольно сложного запроса.

Как и в случае с простыми условиями отбора, значения null влияют на интерпретацию составных условий отбора, вследствие чего результаты последних становятся не столь очевидными. В частности, результатом операции null or true является значение true, а не null, как можно было ожидать. Таблицы 6.1, 6.2 и 6.3 являются таблицами истинности для операторов and, or и not соответственно; здесь *е показано влияние значений null.



1 ... 32 33 34 [ 35 ] 36 37 38 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика