Изменения

Перейти к: навигация, поиск

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

885 байт добавлено, 02:35, 23 декабря 2021
проблемы null
* Результаты множественных операций
Оказывается, что в некоторых случаях без null не обойтись и надо уметь с ним работать.
== Операции Тернарная логика с использованием null ===== Тернарная логика ===
С точки зрения SQL, результат логического выражения может быть ''true'', ''false'' или ''unknown''.<br>
С другой стороны есть тип ''boolean'', и у него есть 3 значения: ''true'', ''false'' и '''''null''''' <br>
То есть формально ''unknown'' - это результат вычисления, а '''''null''''' - это конкретное значение, которое может быть записано в БД. На практике ''unknown'' представляется значением '''''null''''', и это различие не будет иметь большого значения.
==== Логические операции ========= Конъюнкция =====
{| style="background-color:#CCC;margin:0.5px;text-align:center"
!style="background-color:#EEE;color:#00F"| <tex>\bf{and}</tex>
|}
===== Дизъюнкция =====
{| style="background-color:#CCC;margin:0.5px;text-align:center"
!style="background-color:#EEE;color:#00F"| <tex>\bf{or}</tex>
|}
===== Отрицание =====
{| style="background-color:#CCC;margin:0.5px;text-align:center"
!style="background-color:#EEE;color:#00F"| <tex></tex>
|}
=== Сравнение ====== Импликация =====TODO: уточнить* A → B = (not A) or B{| style="background-color:#CCC;margin-left:2rem0.5px;text-align:center"!style="background-color:#EEE;color:#00F"| <tex>\bf{(not\ A)\ or\ B=}</tex>
!style="background-color:#EEE"| <tex>\bf{true}</tex>
!style="background-color:#EEE"| <tex>\bf{unknown}</tex>
|-
|style="background-color:#EEE;padding:2px 30px"| <tex>\bf{unknown}</tex>
|style="background-color:#FFF;padding:2px 30px"| <tex>trueunknown</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>truefalse</tex>|style="background-color:#FFF;padding:2px 30px"| <tex>trueunknown</tex>
|style="background-color:#FFF;padding:2px 30px"| <tex>true</tex>
|}
* A → B = not (A and not B)=== is ===={| style="background-color:#CCC;margin-left:2rem0.5px;text-align:center"!style="background-color:#EEE;color:#00F"| <tex>\bf{not\ (A\ and\ not\ B)}</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>unknown</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{unknownis\ 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:#FFF;padding:2px 30px"| <tex>unknown</tex>
|style="background-color:#FFF;padding:2px 30px"| <tex>unknown</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 ==При работе с '''не работаютnull'''в процессе разработки БД, во избежание непредвиденных ошибок, необъодимо заранее ознакомиться с тем, какие проблемы могут возникнуть. ==== Сравнение =Неоднозначность импликации ===TODO: уточнить* A → B ===== = =====(not A) or B{| style="background-color:#CCC;margin-left:0.5px2rem;text-align:center"!style="background-color:#EEE;color:#00F"| <tex>\bf{=(not\ A)\ or\ B}</tex>
!style="background-color:#EEE"| <tex>\bf{true}</tex>
!style="background-color:#EEE"| <tex>\bf{unknown}</tex>
|-
|style="background-color:#EEE;padding:2px 30px"| <tex>\bf{unknown}</tex>
|style="background-color:#FFF;padding:2px 30px"| <tex>unknowntrue</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>falsetrue</tex>|style="background-color:#FFF;padding:2px 30px"| <tex>unknowntrue</tex>
|style="background-color:#FFF;padding:2px 30px"| <tex>true</tex>
|}
* A → B ===== is =====not (A and not B){| style="background-color:#CCC;margin-left:0.5px2rem;text-align:center"!style="background-color:#EEE;color:#00F"| <tex>\bf{not\ (A\ and\ not\ B)}</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>falseunknown</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>falseunknown</tex>|style="background-color:#FFF;padding:2px 30px"| <tex>unknown</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Оказывается что законы Де Моргана в данном случае ''' не приводила к непреднамеренным ошибкам полезно знать, что работают'''null''' "заразен".<br>Например=== Скалярные операции, следующие порождающие null ===Следующие операции с '''null''' порождают '''null''' , и иногда это может сбивать с толку начинающих разработчиков.
* =, <>, <, <=, >, >=
* +, −, *, /
* ||
* in Рассмотрим несколько примеров.* <font color = blue>select</font> (1 + <font color = blue>null</font>) <font color = blue>from</font> Students;Не смотря на то, что этот запрос не несет большого смысла, на его примере можно убедиться, что в арифместических операциях '''null''in'''(true, false, "заразен". * <font color = blue>select</font> StudentId <font color = blue>from</font> Students where GroupId = null)'' не дает нужного эффекта;Это частая ошибка, т.к. сравнение с '''''null''' попродит ''дает 'null'unknown''), а значит запрос вернет пустую таблицу. === Дубликаты и null ===Так как null ≠ null, сравнения кортежей, содержащих null не обладают интуитивными свойствами, например:* <tex>$R$ \cup $R$</tex> - не всегда <tex>$R$</tex> * <tex>$R$ \cap $R$</tex> - не всегда <tex>$R$</tex> * <tex>$R$ \Bowtie $R$</tex> - не всегда <tex>$R$</tex>  
===== coalesce(v1, v2, ...) =====
* Если все аргументы null - возвращает '''null'''
=== Дубликаты и null ===Так как null ≠ null, сравнения кортежей, содержащих null не обладают интуитивными свойствами, например:* ''R ∪ R'' - не всегда R * ''R ∩ R'' - не всегда R* ''R ⋈ R'' - не всегда R
=== Спецэффекты ===
Из-за наличия '''null''', этот запрос не отработает так, как предполагалось.
== Null и Работа с null в SQL ==
=== Предикаты ===
==== DML ====
71
правка

Навигация