Неполные данные и null — различия между версиями
Teptind (обсуждение | вклад) м (→Логические операции) |
Teptind (обсуждение | вклад) (→Логические операции) |
||
Строка 133: | Строка 133: | ||
|} | |} | ||
Оказывается что законы Де Моргана в данном случае '''не работают'''. | Оказывается что законы Де Моргана в данном случае '''не работают'''. | ||
+ | |||
+ | ==== Логические операции ==== | ||
+ | ===== Равенство ===== | ||
+ | {| style="background-color:#CCC;margin:0.5px;text-align:center" | ||
+ | !style="background-color:#EEE;color:#00F"| <tex>\bf{=}</tex> | ||
+ | !style="background-color:#EEE"| <tex>\bf{true}</tex> | ||
+ | !style="background-color:#EEE"| <tex>\bf{unknown}</tex> | ||
+ | !style="background-color:#EEE"| <tex>\bf{false}</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;padding:2px 30px"| <tex>\bf{true}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>unknown</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;padding:2px 30px"| <tex>\bf{unknown}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>unknown</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>unknown</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>unknown</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;padding:2px 30px"| <tex>\bf{false}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>unknown</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>екгу</tex> | ||
+ | |} | ||
+ | ===== is ===== | ||
+ | {| style="background-color:#CCC;margin:0.5px;text-align:center" | ||
+ | !style="background-color:#EEE;color:#00F"| <tex></tex> | ||
+ | !style="background-color:#EEE"| <tex>\bf{true}</tex> | ||
+ | !style="background-color:#EEE"| <tex>\bf{unknown}</tex> | ||
+ | !style="background-color:#EEE"| <tex>\bf{false}</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;color:#00F;;padding:2px 30px"| <tex>\bf{is true}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;color:#00F;;padding:2px 30px"| <tex>\bf{is\ unknown}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;color:#00F;;padding:2px 30px"| <tex>\bf{is\ false}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;color:#00F;;padding:2px 30px"| <tex>\bf{is\ not\ true}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;color:#00F;;padding:2px 30px"| <tex>\bf{is\ not\ unknown}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |- | ||
+ | |style="background-color:#EEE;color:#00F;;padding:2px 30px"| <tex>\bf{is\ not\ false}</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>true</tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>false</tex> | ||
+ | |} | ||
== Null и SQL == | == Null и SQL == | ||
todo | todo |
Версия 14:12, 20 декабря 2021
Содержание
Что означает null
Представим себе таблицы в БД университета ИТМО
- Students(StudentId, StudentName, GroupId)
- Groups(GroupId, GroupName)
Что может означать тот факт, что у студента null в столбце GroupId?
- Значение неизвестно (нет информации, из какой группы студент)
- Значение неверно (студент учится в какой-то группе, но эта группа не представлена в БД)
- Значение еще/уже не существует (студент был зачислен, но еще не распределен в группу или уже отчислен)
- Значение не имеет смысла (студент из другого университета, который пришел с какими-то целями в ИТМО)
- Значение недоступно (недостаточно прав узнать группу)
На основе этих предположений можно сделать вывод, что значение null сильно зависит от контекста (какую предметную область мы моделируем итд.).
Вполне возможно, что возникнет необходимость различать разные виды того, что значение в том или ином смысле отсутствует.
Можно ли обойтись без null?
Как представить кортеж с неопределенными частями в нашем случае?
- Разбить на 2 группы и сделать необязательную связь 1:1. В таком случае, в дополнительной таблице будет запись (StudentId, GroupId) тогда и только тогда, когда у студента определена группа
Где еще появляется null
- Результаты внешних соединений
- Результаты множественных операций
Оказывается, что в некоторых случаях без null не обойтись и надо уметь с ним работать.
Операции с null
Тернарная логика
С точки зрения SQL, результат логического выражения может быть true, false или unknown.
С другой стороны есть тип boolean, и у него есть 3 значения: true, false и null
То есть формально unknown - это результат вычисления, а null - это конкретное значение, которое может быть записано в БД. На практике unknown представляется значением null, и это различие не будет иметь большого значения.
Логические операции
Конъюнкция
Дизъюнкция
Отрицание
Импликация
TODO: уточнить
- A → B = (not A) or B
- A → B = not (A and not B)
Оказывается что законы Де Моргана в данном случае не работают.
Логические операции
Равенство
is
Null и SQL
todo