Базы данных

Неполные данные и null

Что означает null?

Содержание

Что означает GroupId is null?

  • Значение не известно
    • Студент неизвестно какой группы
  • Значение не верно
    • Студент группы XXXX
  • Значение ещё/уже не существует
    • Студент зачислен, но не определен в группу
    • Группа отчисленного студента
  • Значение не имеет смысла
    • Студент другого университета
  • Недоступно
    • Нет права узнать группу

Можно ли обойтись без null?

  • Представление отсуствующих значений
    • Как представить кортеж, с неопределенными частями?
    • Необязательная связь 1:1
  • Где еще появляется null?
    • Множественные операции
    • Внешние соединения
    • ⇒ без null не обойтись

Операции с null

Содержание

Тернарная логика (1)

  • Логические операции
    • Конъюнкция
      and false unknown true
      false false false false
      unknown false unknown unknown
      true false unknown true
    • Дизъюнкция
      or false unknown true
      false false unknown true
      unknown unknown unknown true
      true true true true
    • Отрицание
      false unknown true
      not true unknown false

Тернарная логика (2)

  • Импликация
    • A → B = ¬ A ∨ B
      A \ B false unknown true
      false true true true
      unknown unknown unknown true
      true false unknown true
    • A|B → B = ¬ (A ∨ B) ∨ B = ¬ A ∧ ¬ B ∨ B =
      = (¬ A ∨ B) ∧ (¬ B ∨ B) = ¬ A ∨ B
      A \ B false unknown true
      false true unknown true
      unknown unknown unknown true
      true false unknown true
    • Обычный вывод не работает

Тернарная логика (3)

  • Сравнение
    • Равенство
      = true unknown false
      true true unknown false
      unknown unknown unknown unknown
      false false unknown true
    • is
      true unknown false
      is true true false false
      is unknown false true false
      is false false false true
      is not true false true true
      is not unknown true false true
      is not false true true false

Скалярные операции

  • null заразен
    • =, <>, <, <=, >, >=
    • +, , *, /
    • ||
    • in
  • coalesce(v1, v2, ...)
    • первый не null

Null и дубликаты

  • Как сравнивать кортежи, содержащие null?
  • Чему равно $R ∪ R$?
  • Чему равно $R ∩ R$?
  • Чему равно $R ⋈ R$?
    • $R ⋈ R ≠ R$

Спецэффекты

  • Чему равно x = x?
    • true или null
  • Чему равно x <> x?
    • false или null
  • Чему равно x or x?
    • x
  • Чему равно x or not x?
    • true или null
  • Чему равно x and not x?
    • false или null
  • Транзитивность сравнения?

Null и ключи

  • Первичные ключи
    • Не могут содержать null
  • Альтернативные ключи
  • Внешние ключи
    • Простые
    • Составные
      • Отсутствующие целиком

Null не интутитивен

  • Студенты не учащиеся в группе M34391
    • select * from Students where GId <> 'M34391';
      
    • Корректность зависит от смысла null
  • Все студенты?
    • select * from Students where GId <> 'M34391'
      union
      select * from Students where GId = 'M34391'
      
    • Нет!

Null и SQL

Содержание

Предикаты

  • DML
    • where
    • having
    • Остаются только true
    • unknown → false
  • DDL
    • check
    • Не подходят только false
    • unknown → true

Различимость

  • Два null
    • Не равны
    • Не различимы
  • Использование
    • distinct
    • group by
    • Операции на множествах

Типы столбцов

  • nullable (по умолчанию)
    • birthday date
      
  • Не nullable
    • birthday date not null
      

Проверки значений

  • Синтаксис
    • значение is [not] {null|true|false|unknown}
      
  • Примеры
    • x is null
      x is not true
      (x or x) is not null
      

Прочее

  • exists
    • Только true или false
    • nullfalse
  • Агрегирующие функции
    • Пропускают null
    • Без аргументов ⇒ null
    • Кроме count(*)
  • order by сортирует null
    • nulls first/last

Литература

Содержание

Основная литература