Программирование >>  Реляционные базы данных 

1 ... 80 81 82 [ 83 ] 84 85 86 ... 125


Специфика значений NULL

Предполагается, что NULL в SQL2 всегда можно считать значением, которое не известно, но обязательно существует . Однако во многих случаях такое интуитивное понимание NULL оказывается неверным. Допустим, например, что X - компонент кортежа, областью значения которого являются целые числа. Можно утверждать, что О * дг имеет значение О, так как умножение любого числа на О дает 0. Но если .х содержет значение NULL, по правилу (I) 113 разаела 5.9.1 произведение О и NULL дает NULL. Аналогично, .х-х= О, так как раз1юсть любого целого числа с самим собой всегда равна О, а применение правила (I) и в этом случае дает NULL.

Пример S.45. Пусть х имеет значение NULL. Тогда .х + 3 тоже равно NULL-Однако NULL + 3 не является правильным выражением SQL Значением выражения

x-i является UNKNOWN, так как значение х - это NULL и Mbi не знаем, равно ли оно 3. Сравнение NULL также не является корректным выражением SQL. □

5.9 Пустые значения

и внешние соединения

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

5.9.1 Операции на значениях NULL

В разделе 4.7.4 было показано, как специальное значение NULL применяется для обозначения неизвестного или иесушествуюшего значения. NULL используется, например, тогда, когда кортеж вставляется в отношение с помощью ко.мйцды, определяющей некоторые, хотя и не все компоненты кортежа. NULL появляется в компонентах, значения которых не определены, если для них не установлено другое значение по умолчанию. Другим источником NULL является внешнее соеди-1ение.

При дейстннях со значением NULL нужно соблюдать два важных правила.

1. Результатом применения арифметических операторов типа х или + к NULL и другому знамению, содержащему NULL, должно быть значение NULL.

2. Результатом сравнения NULL с любым другим эначенне.м, содержащим NULL, с помощью операторов типа = или > должно быть значение UNKNOWN. Оио является третьим истинностным значением наряду с TRUE и FALSE.

Хотя значение NULL и может появляться в кортежах, оно не является константой. Г1оэто.му сформулированные выше правила можно применять для операций иа выражениях, содержащих NULL, но само это значение нельзя использовать явным образом в виде операнда.



Правильным способом определения, имеет ли х значение MULL, является выражение х IS NULL. Оно истинно, если х имеет значение NULL, и ложно в про-ТИВНО.М случае. Выражение х IS NOT NULL истинно, если значением х не является NULL.

5-9-2 Истинностное значение UNKNOWN

в разделе 5.1.2 говорилось, что результатами сравнения являются TRUE или FALSE, и эти истшшостные значения стандартным образом комбинируются с помошью связок AND. OR и NOT. При наличии значения NULL сравнение может дать и значение UNKNOWN. Рассмотрим, как ведут себя операторы при комбинировании всех трех истинностных значений.

Следующие правила легче запомнить, обозначив TRUE как 1 (полностью истинно), FALSE как О (полностью ложно) и UNKNOWN как 1/2 (где-то между истинным и ложным).

1. AND с двумя истинностными значениями дает минимум от этих значений: X AND у принимает значение FALSE, если х или у есть FALSE; значение UNKNOWN, если ни л:, ни у не имеют значения FALSE, но по крайней мере один из них имеет значение UNKNOWN, и значение TRUE, если и х, и V имеют значение TRUE.

2. OR с двумя истинностными значениями дает максимум от этих значений: дг OR у принимает значение TRUE, если х или у есть TRUE; значение FALSE, еслн л- или у имеет Значение FALSE, и значение UNKNOWN, если ни Л , ни у не имеют значения TRUE, но по крайней мере один из них имеет значение UNKNOWN.

3. Отрицание истинностного значения равно 1 минус данное истинностное значение: NOT х принимает значение TRUE при значении х FALSE; значение FALSE при значении лг-TRUE и значение UNKNOWN при значении л- - UNKNOWN.

На рис. 5.19 представлены результаты применения трех логических операторов к девяти различным комбинациям истинностных-значений операндов .т и у. Значение последнего оператора NOT зависит только от х.

xANDy

xORy

NOTx

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

UNKNOWN

UNKNOWN

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

FALSE

UNKNOWN

TRUE

UNKNOWN

TRUE

UNKNOWN

UNKNOWN

UNKNOWN

UNKNOWN

UNKNOWN

UNKNOWN

UNKNOWN

FALSE

FALSE

UNKNOWN

UNKNOWN

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

UNKNOWN

FALSE

UNKNOWN

TRUE

FALSE

FALSE

FALSE

FALSE

TRUE

Рис. 5.19- Истинносгноп тоблицо длв трехзначной логики f/,

SQL-условия, стоящие в предложениях WHERE запросов типа select-from-where. . или в операциях DELETE, применяются к каждому кортежу некоторого отношения, , и дня каждого кортежа порождается одно из значений: TRUE, FALSE или UNKNOWN. ,



Однако в отпет входят только те кортежи, для которых заданное условие имеет значение TRUE, а кортежи с UNKNOWN или FALSE из ответа исключаются. В такой ситуации могут возникнуть неожиданности, подобные тем, которые упоминались в заключенном в рамку тексте Специфика значений NULL .

Пример S.46. Рассмотрим отношение

Movie(title, year, length. InColor. studioName. producerC#)

II запрос

SELECT * FROM Movie

WHERE length <= 120 OR length > 120

Можно предположить, что в результате такого запроса получится копия отношения Movie, так как каждый фильм имеет либо меньшую продолжительность, либо равную, либо превышающую 120.

Но предположим, что в Movie есть кортежи со значением NULL в компоненте lengtli. Тогда оба сравнения ~ length <= 120 и length > 120 - принимают значение UNKNOWN. Согласно рис. 5.19 два значения UNKNOWN со связкой OR дают UNKNOWN. Поэтому для любого кортежа с NULL в компоненте length пункт WHERE принимает значение UNKNOWN и этот кортеж не включается в ответ на запрос. Значит, смысл данного запроса - найти кортежи без значений NULL в компоненте length. □

5.9.3 Выражение соединений в SQL2

Прежде чем ввести операцию внешнего соединения S0L2, рассмотрим про-стейшИ11 случай обычного соединения. В SQL2 доступно множество видов операторов соединения. В более ранних стандартах SQL их в явном виде нет, но равный их применению эффект можно получить с помощью запросов типа select-from-where. В SQL2 соединения являются альтернативой запросам типа select-from-where и их можно использовать всегда, когда допустимо применение запросов такого типа. Поскольку соединения порождают отношения, их можно применять и в пунктах FROM этих запросов.

Простейшая форма соединения - перекрестное соединение. Этот термин - синоним декартова произведения или просто произведения из раздела 4.1.4. Например, для получения произведения двух отношений

Movie(titte, year length, InColor, studioName. producerC#) Starsln(mQVieTltle. movieYear, starNeme)

можно записать выражение

Movie CROSS JOIN Slarsin

и в результате получить отношение с девятью столбцами и всеми атрибутами отношений Movie и Starsin. Кортежем результирующего отношения будет каждая пара, сосгояшая из одного кортежа из Movie и одного кортежа нз Starsin.

Атрибуты результирующего отношения можно обозначить где R - одно из соединяемых отношений, а - один из его атрибутов. Обычно R и точку можно пропустить, если только одно из отношений имеет атрибуг А. В данном примере У отношений Movie и Starsin нет обших атрибутов и для произведения достаточно девяти имен атрибутов.



1 ... 80 81 82 [ 83 ] 84 85 86 ... 125

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