|
Программирование >> Реляционные базы данных
Специфика значений 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 зависит только от х.
Рис. 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 нет обших атрибутов и для произведения достаточно девяти имен атрибутов.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |