Работа с нулевыми (NULL) значениями

Часто будут иметься записи в таблице, которые не имеют значений в некоторых полях, например, потому что ввод информации не завершен, или потому, что это поле просто не заполнялось. SQL учитывает такой вариант, позволяя вам вводить значение NULL (пустой) в поле, вместо значения. Когда значение поля равно NULL, это означает, что программа базы данных специально промаркировала это поле как не имеющее никакого значения для этой строки (или записи). Это отличается от просто назначения полю значения нуля или пробела, которые база данных будет обрабатывать также как и любое другое значение. Точно так же, как NULL не является техническим значением, оно не имеет и типа данных. Оно может помещаться в любой тип поля. Тем ни менее, NULL в SQL часто упоминается как нуль.

Предположим, что вы получили нового заказчика, который еще не был назначен продавцу. Чем ждать продавца, к которому его нужно назначить, вы можете ввести заказчика в базу данных теперь же, так что он не потеряется при перестановке. Вы можете ввести строку для заказчика со значением NULL в поле snum и заполнить это поле значением позже, когда продавец будет назначен.

Оператор NULL

Так как NULL указывает на отсутствие значения, вы не можете знать, каков будет результат любого сравнения с использованием NULL. Когда NULL сравнивается с любым значением, даже с другим таким же NULL, результат будет ни верным, ни неверным, он — неизвестен. Неизвестный Булев, вообще ведет себя также как неверная строка, которая, произведя неизвестное значение в предикате, не будет выбрана запросом — имейте в виду, что в то время как NOT (неверное) — равняется верно, NOT (неизвестное) — равняется неизвестно. Следовательно, выражение типа 'city = NULL' или 'city IN (NULL)' будет неизвестно, независимо от значения city. Часто вы должны делать различия между "неверно" и "неизвестно" — между строками, содержащими значения столбцов, которые не соответствуют условию предиката и которые содержат NULL в столбцах. По этой причине, SQL предоставляет специальный оператор IS, который используется с ключевым словом NULL, для размещения значения NULL. Найдем все записи в нашей таблице Заказчиков с NULL значениями в столбце city:

SELECT *
FROM Customers
WHERE city IS NULL;

Здесь не будет никакого вывода, потому что мы не имеем никаких значений NULL в наших типовых таблицах. Значения NULL — очень важны, и мы вернемся к ним позже.

Использование NOT со специальными операторами

Специальным операторам, которые мы изучали в этой главе, может предшествовать Булев оператор NOT.

Он противоположен реляционным операторам, которые должны иметь оператор NOT вводимым выражением. Например, если мы хотим устранить NULL из нашего вывода, мы будем использовать NOT, чтобы изменить на противоположное значение предиката:

SELECT *
FROM Customers
WHERE city NOT NULL;

При отсутствии значений NULL (как в нашем случае), будет выведена вся таблица Заказчиков. Аналогично можно ввести следующее:

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.

=============== SQL Execution Log ============
| SELECT * |
| FROM Salespeople |
| WHERE city NOT IN ('London', 'San Jose'; |
| ==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1003 Rifkin Barcelona 0.15 |
| 1007 Axelrod New York 0.10 |
===============================================

Рисунок 5.9. Использование NOT с IN

Таким же способом Вы можете использовать NOT BETWEEN и NOT LIKE.

Резюме

Теперь вы можете создавать предикаты в терминах связей специально определенных SQL. Вы можете искать значения в определенном диапазоне (BETWEEN) или в числовом наборе (IN), или вы можете искать символьные значения которые соответствуют тексту внутри параметров (LIKE).

Вы также изучили некоторые вещи относительно того, как SQL поступает при отсутствии данных — что часто является реальностью в базах данных — используя NULL вместо конкретных значений. Вы можете включать значения NULL в вывод или исключать их из него, используя оператор IS NULL(илиNOT NULL).

Теперь, когда вы имеете в вашем распоряжении весь набор стандартных математических и специальных операторов, вы можете переходить к специальным функциям SQL, которые работают на всех группах значений, а не просто на одиночном значении, что важно. Это уже тема Главы 6.

Работа с SQL

1. Напишите два запроса, которые могли бы вывести все Заказы на 3 или 4 Октября 1990

2. Напишите запрос, который выберет всех заказчиков, обслуживаемых продавцами Peel или Motika. (Подсказка: из наших типовых таблиц, поле snum связывает вторую таблицу с первой)

3. Напишите запрос, который может вывести всех заказчиков, чьи имена начинаются с буквы попадающей в диапазон от A до G.

4. Напишите запрос, который выберет всех пользователей, чьи имена начинаются с буквы C.

5. Напишите запрос который выберет все Заказы, имеющие нулевые значения или NULL в поле amt (сумма).

(См. Приложение A для ответов.)