
- •Лекция № 1. Введение
- •1. Системы управления базами данных
- •2. Реляционные базы данных
- •Лекция № 2. Отсутствующие данные
- •1. Пустые значения (Empty-значения)
- •3. Null-значения и общее правило вычисления выражений
- •4. Null-значения и логические операции
- •5. Null-значения и проверка условий
- •Лекция № 3. Реляционные объекты данных
- •1. Требования к табличной форме представления отношений
- •2. Домены и атрибуты
- •3. Схемы отношений. Именованные значения кортежей
- •4. Кортежи. Типы кортежей
- •5. Отношения. Типы отношений
- •Лекция № 4. Реляционная алгебра. Унарные операции
- •1. Унарная операция выборки
- •2. Унарная операция проекции
- •3. Унарная операция переименования
- •4. Свойства унарных операций
- •Лекция № 5. Реляционная алгебра. Бинарные операции
- •1. Операции объединения, пересечения, разности
- •2. Операции декартового произведения и естественного соединения
- •3. Свойства бинарных операций
- •4. Варианты операций соединения
- •5. Производные операции
- •6. Выражения реляционной алгебры
- •Лекция № 6. Язык SQL
- •1. Оператор Select – базовый оператор языка структурированных запросов
- •2. Унарные операции на языке структурированных запросов
- •1. Операция выборки.
- •2. Операция проекции.
- •3. Операция переименования.
- •3. Бинарные операции на языке структурированных запросов
- •1. Операция объединения.
- •2. Операция пересечения.
- •3. Операция разности.
- •4. Операция декартова произведения.
- •5. Операции внутреннего соединения.
- •6. Операция естественного соединения.
- •7. Операция левого внешнего соединения.
- •8. Операция правого внешнего соединения.
- •9. Операция полного внешнего соединения.
- •4. Использование подзапросов
- •Лекция № 7. Базовые отношения
- •1. Базовые типы данных
- •2. Пользовательский тип данных
- •3. Значения по умолчанию
- •4. Виртуальные атрибуты
- •5. Понятие ключей
- •Лекция № 8. Создание базовых отношений
- •1. Металингвистические символы
- •2. Пример создания базового отношения в записи на псевдокоде
- •3. Ограничение целостности по состоянию
- •4. Ограничения ссылочной целостности
- •5. Понятие индексов
- •6. Модификация базовых отношений
- •Лекция № 9. Функциональные зависимости
- •1. Ограничение функциональной зависимости
- •2. Правила вывода Армстронга
- •3. Производные правила вывода
- •4. Полнота системы правил Армстронга
- •Лекция № 10. Нормальные формы
- •1. Смысл нормализации схем баз данных
- •2. Первая нормальная форма (1NF)
- •3. Вторая нормальная форма (2NF)
- •4. Третья нормальная форма (3NF)
- •5. Нормальная форма Бойса – Кодда (NFBC)
- •6. Вложенность нормальных форм
- •Лекция № 11. Проектирование схем баз данных
- •1. Различные типы и кратности связей
- •2. Диаграммы. Виды диаграмм
- •3. Связи и миграция ключей
- •Лекция № 12. Связи классов сущностей
- •1. Иерархическая рекурсивная связь
- •2. Сетевая рекурсивная связь
- •3. Ассоциация
- •4. Обобщения
- •5. Композиция
- •6. Агрегация
- •7. Унификация атрибутов
- •Лекция № 13. Экспертные системы и продукционная модель знаний
- •1. Назначение экспертных систем
- •2. Структура экспертных систем
- •3. Участники разработки экспертных систем
- •4. Режимы работы экспертных систем
- •5. Продукционная модель знаний
5. Null-значения и проверка условий
Итак, из всего вышесказанного можно сделать вывод, что в логике систем управления базами данных имеются не два логических значения (True и False), а три, ведь Null-значение также рассматривается как одно из возможных логических значений. Именно поэтому на него часто ссылаются как на неизвестное значение, значение Unknown.
Однако, несмотря на это, в системах управления базами данных реализуется только двузначная логика. Поэтому условие с Null-значением (неопределенное условие) должно интерпретироваться машиной либо как True, либо как False.
В языке СУБД по умолчанию установлено опознавание условия с Null-значением как значения False. Проиллюстрируем это следующими примерами реализации в системах управления базами данных условных операторов If и While:
If P then A else B;
Эта запись означает: если P принимает значение True, то выполняется действие A, а если P принимает значение False или Null, то выполняется действие B.
Теперь применим к этому оператору операцию отрицания, получим:
If ¬P then B else A;
В свою очередь, этот оператор означает следующее: если ¬P принимает значение True, то выполняется действие B, а в том случае, если ¬P принимает значение False или Null, то будет выполняться действие A.
И снова, как мы видим, при появлении Null-значения мы сталкиваемся с неожиданными результатами. Дело в том, что два оператора If в этом примере не эквивалентны! Хотя один из них получен из другого отрицанием условия и перестановкой ветвей, т. е. стандартной операцией. Такие операторы в общем случае эквивалентны! Но в нашем примере мы видим, что Null-значению условия P в первом случае соответствует команда B, а во втором – A.
А теперь рассмотрим действие условного оператора While:
While P do A; B;
Как работает этот оператор? Пока переменная P имеет значение True, будет выполняться действие A, а как только P примет значение False или Null, выполнится действие B.
Но не всегда Null-значения интерпретируются как False. Например, в ограничениях целостности неопределенные условия опознаются как True (ограничения целостности – это условия, накладываемые на входные данные и обеспечивающие их корректность). Это происходит потому, что в таких ограничениях отвергнуть нужно только заведомо ложные данные.
И опять-таки в системах управления базами данных существует специальная функция подмены IfNull (ограничения целостности, True), с помощью которой Null-значения и неопределенные условия можно представить в явном виде.
Перепишем условные операторы If и While с использованием этой функции:
1)If IfNull ( P, False) then A else B;
2)While IfNull ( P, False) do A; B;
Итак, функция подмены IfNull (выражение 1, выражение 2) возвращает значение первого выражения, если оно не содержит Null-значения, и значение второго выражения – в противном случае.
Надо заметить, что на тип возвращаемого функцией IfNull выражения никаких ограничений не накладывается. Поэтому с помощью этой функции можно явно переопределить любые правила работы с Null-значениями.