Оператор IS NULL
символ надо понимать буквально так, как он указан", а второй раз указывает на то, что речь идет непосредственно об Еsсаре-символе. Далее представлен пример поиска строки '_}' в столбце sname:
SELECT •
FROM Salespeople
WHERE sname LIKE 'Х/_//Х' ESCAPE. /';
В этом случае выходных данных нет. Просматриваемая строка состоит из любой последовательности символов(%), за которыми следуют символ подчеркивания(/_), Еsсаре-символ (//)и любая последовательность заключительных символов(%).
Работа с NULL-значениями
Часто в таблице встречаются записи с незаданными значениями какого-либо из по лей, потому что значение поля неизвестно или его просто нет. В таких случаях SQL по зволяет указать в поле NULL-значение. Строго говоря, NULL-значение вовсе не представлено в поле. Когда значение поля есть NULL это значит, что программа базы данных специальным образом помечает поле, как не содержащее какого-либо значения для данной строки (записи). Дело обстоит не так в случае простого приписывания полю значения "нуль" или "пробел", которые база данных трактует как любое другое значе ние. Поскольку NULL не является значением как таковым, он не имеет типа данных. NULL может размещаться в поле любого типа. Тем не менее, NULL, как NULL- значение, часто используется в SQL.
Предположим, появился покупатель, которому еще не назначен продавец. Чтобы констатировать этот факт, нужно ввести значение NULL в поле snum, а реальное зна чение включить туда позже, когда данному покупателю будет назначен продавец.
Оператор IS NULL
Поскольку NULL фиксирует пропущенные значения, результат любого сравнения при наличии NULL-значений неизвестен. Когда NULL-значение сравнивается с лю бым значением, даже с NULL-значением, результат просто неизвестен. Булево значе ние "неизвестно" ведет себя также, как "ложь" - строка, на которой предикат принимает значение "неизвестно", не включается в результат запроса - при одном важном исключении: NOT от лжи есть истина (NOT (false)=true), тогда как NOT от не известного значения есть также неизвестное значение. Следовательно, такое выраже ние как "city = NULL" или "city IN (NULL)" является неизвестным независимо от значения city.
Часто необходимо различать false и unknown - строки, содержащие значения столбца, не удовлетворяющие предикату, и строки, которые содержат NULL. Для этой цели SQL располагает специальным оператором IS, который используется с ключевым словом NULL для локализации NULL-значения.
47
Глава 5. Использование с11ециаль11ых операторов в "условиях"
Для нахождения всех записей со значениями NULL в таблице Customers в столбце city следует ввести:
SELECT •
FROM Customers
WHERE city IS NULL;
В данном случае выходных данных не будет, поскольку в конкретных простых таб
лицах нет NULL-значений.
NULL-значения чрезвычайно важны, поэтому имеет смысл вернуться к ним
позже.
Использование NOT со специшzьными 01~ераторами
Специальные операторы, которые были рассмотрены в этой главе, могут непосред ственно предшествовать булеву оператору NOT. Этим они отличаются от операторов сравнения, которые должны содержать NOT перед всем выражением. Например, если не осуществляется поиск NULL-значений, а, напротив, необходимо исключить их из выходных данных, то нужно использовать NOT для того, чтобы придать предикату
противоположное значение:
SELECT •
FROM Customers
WHERE city IS NOT NULL;
Если NULL-значения отсутствуют (в данном случае это именно так), то в результа те выполнения этого запроса будет получена вся таблица Customers, что эквивалентно
вводу:
SELECT •
FROM Customers
WHERE NOT city IS NULL;
что тоже приемлемо.
Можно также использовать NOT и IN:
SELECT •
FROM Salespeople
WHERE city NOT IN ('London', ·san Jose');
Другой способ выразить то же самое:
SELECT •
FROM Salespeople
WHERE NOT city IN ( 'London' , 'San Jose');
Выходные данные для этого запроса представлены на рис. 5.9.
48
Итоги
|
|
SQl |
lcxecut1on Log-- -- |
- -- -~ |
ст |
* |
|
|
11 |
Salespeople |
|
|
||
WHERE |
c1t |
NOl IN ('London','San Josc'): |
|
|
WilifШM |
i1#iШ- |
,,, |
э.1,,r,81 |
|
|
HIHIJ7 |
Ri fi<in |
Barcelona |
". 15 |
|
1011!3 |
Axelrod |
|
0. 111! |
Рис. 5.9.
и NOT LIKE.
Итоги
Теперь вы научились конструировать предикаты в терминах отношений, специаль но определенных для SQL, искать значения в определенном диапазоне (BETWEEN) или значения, принадлежащие определенному множеству (IN), искать символьные
значения, удовлетворяющие заданному символьному шаблону (LIКE).
Вы поняли, как SQL реагирует на пропуски данных ( вполне реальная ситуация для мира баз данных) с помощью NULL-значений. Вы умеете извлекать NULL-значения или исключать их из выходных данных, применяя оператор IS NULL (или IS NOT NULL). Полный набор стандартных математических функций и специальных опера торов позволяет переходить к специальным функциям SQL, которые оперируют целы
ми группами, а не на единичными значениями. Этому посвящена глава 6.
49
Работаем на SQL
1.Запишите два запроса, которые выдают сведения о всех заявках, принятых 3 или 4 октября 1990 года.
2.Запишите запрос, который выбирает всех покупателей, обслуживаемых Рее! или Motika. (Подсказка: поле snum связывает две таблицы друг с другом.)
3.Запишите запрос, который выбирает всех покупателей, имена которых начина ются на любую из букв от 'А' до 'G'.
4.Запишите запрос, который выбирает всех покупателей, имена которых начина ются на 'С'.
5.Запишите запрос, который выбирает все заявки, у которых в поле amt (amount) указано значение О или NULL.
(Ответы см. в 11риложении А.)
50
6
8J П []] ~ D D u
Суммирование данных
с помощью функций
агрегирования