Mam nadzieję, że tutaj wyjaśnię swoje stanowisko.
Ta NULL = NULL
ocena FALSE
jest błędna. Hacker i Mister odpowiedzieli poprawnie NULL
. Oto dlaczego. Dewayne Christensen napisał do mnie w komentarzu do Scotta Iveya :
Ponieważ jest grudzień, posłużmy się przykładem sezonowym. Pod drzewem mam dwa prezenty. Teraz powiedz mi, czy mam dwa takie same, czy nie.
Mogą być różne lub równe, nie wiadomo, dopóki jeden nie otworzy obu prezentów. Kto wie? Zaprosiłeś dwie osoby, które się nie znają i obie zrobiły Ci ten sam prezent - rzadki, ale nie niemożliwy § .
A więc pytanie: czy te dwa NIEZNANE przedstawiają się tak samo (równe, =)? Prawidłowa odpowiedź to: NIEZNANA (tj NULL
.).
Ten przykład miał na celu zademonstrowanie, że „.. ( false
lub null
, w zależności od systemu) ..” jest poprawną odpowiedzią - nie jest, tylko NULL
jest poprawna w 3VL (czy możesz zaakceptować system, który daje błędne odpowiedzi? )
Prawidłowa odpowiedź na to pytanie musi podkreślać te dwie kwestie:
- logika trójwartościowa (3VL) jest sprzeczna z intuicją (zobacz niezliczone inne pytania na ten temat na Stackoverflow i na innym forum, aby się upewnić);
- Bazujące na SQL systemy DBMS często nie uwzględniają nawet 3VL, czasami podają błędne odpowiedzi (jak w tym przypadku w oryginalnym plakacie, SQL Server).
Powtarzam więc: SQL nie jest dobrym sposobem na zmuszanie do interpretacji zwrotnej właściwości równości, która stwierdza, że:
for any x, x = x
§§ (w prostym języku angielskim: bez względu na wszechświat dyskursu, „rzecz” jest zawsze sobie równa ).
.. w 3VL ( TRUE
, FALSE
, NULL
). Oczekiwanie ludzi byłoby zgodne z 2VL ( TRUE
, FALSE
co nawet w SQL jest poprawne dla wszystkich innych wartości), tj. x = x
Zawsze obliczane do TRUE
, dla dowolnej możliwej wartości x - bez wyjątków.
Zauważ również, że wartości NULL są poprawnymi „ nie-wartościami ” (jak udają ich apologeci), które można przypisać jako wartości atrybutów (??) jako część zmiennych relacji. Są to więc dopuszczalne wartości każdego typu (domeny), a nie tylko typu wyrażeń logicznych.
I o to mi chodziło : NULL
jako wartość jest „dziwną bestią”. Bez eufemizmu wolę powiedzieć: nonsens .
Myślę, że to sformułowanie jest dużo jaśniejsze i mniej dyskusyjne - przepraszam za moją słabą znajomość angielskiego.
To tylko jeden z problemów NULLów. Lepiej ich całkowicie unikać, jeśli to możliwe.
§ martwimy się tutaj o wartości , a więc fakt, że te dwa prezenty są zawsze dwoma różnymi przedmiotami fizycznymi, nie jest uzasadnionym zarzutem; jeśli nie jesteś przekonany, przepraszam, to nie jest miejsce na wyjaśnienie różnicy między semantyką wartości i "obiektu" (algebra relacyjna ma semantykę wartości od samego początku - patrz zasada informacyjna Codda; Myślę, że niektórzy implementatorzy SQL DBMS nie obchodzi mnie nawet wspólna semantyka).
§§ o ile wiem, jest to aksjomat akceptowany (w takiej czy innej formie, ale zawsze interpretowany w 2VL) od starożytności i to właśnie dlatego , że jest tak intuicyjny. 3VLs (w rzeczywistości jest rodziną logiki) to znacznie nowszy rozwój (ale nie jestem pewien, kiedy został opracowany po raz pierwszy).
Uwaga boczna: jeśli ktoś wprowadzi typy Bottom , Unit i Option jako próby uzasadnienia SQL NULL, przekona mnie dopiero po dość szczegółowym badaniu, które pokaże, jak implementacje SQL z NULLami mają system typów dźwięku i wyjaśnię, na koniec, czym naprawdę są wartości NULL (te „wartości-nie-wartości”).
W dalszej części zacytuję niektórych autorów. Jakikolwiek błąd lub przeoczenie jest prawdopodobnie mój, a nie oryginalnych autorów.
Joe Celko o wartościach NULL SQL
Widzę, że Joe Celko jest często cytowany na tym forum. Najwyraźniej jest tu bardzo szanowanym autorem. Więc powiedziałem sobie: „co on napisał o NULLach SQL? Jak wyjaśnia liczne problemy NULL-ów?”. Jeden z moich znajomych ma ebookową wersję SQL Joe Celko for smarties: zaawansowane programowanie SQL, 3. wydanie . Zobaczmy.
Najpierw spis treści. Najbardziej uderza mnie to, ile razy pojawia się NULL i w najróżniejszych kontekstach:
3.4 Arytmetyka i wartości NULL 109
3.5 Konwersja wartości do iz wartości NULL 110
3.5.1 Funkcja NULLIF () 110
6 NULL: brakujące dane w SQL 185
6.4 Porównywanie wartości NULL 190
6.5 NULL i logika 190
6.5.1 NULLS w predykatach podzapytań 191
6.5.2 Standard Rozwiązania SQL 193
6.6 Matematyka i wartości NULL 193
6.7 Funkcje i wartości NULL 193
6.8 NULL i języki hosta 194
6.9 Porady projektowe dla wartości NULL 195
6.9.1 Unikanie wartości NULL w programach nadrzędnych 197
6.10 Uwaga na temat wielu wartości NULL 198
10.1 Predykat IS NULL 241
10.1. 1 Źródła wartości NULL 242
...
i tak dalej. Dla mnie to brzmi „paskudny przypadek specjalny”.
Omówię niektóre z tych przypadków z fragmentami tej książki, próbując ograniczyć się do najważniejszych z powodów związanych z prawem autorskim. Myślę, że te cytaty mieszczą się w doktrynie „dozwolonego użytku” i mogą nawet zachęcać do zakupu książki - więc mam nadzieję, że nikt nie będzie narzekał (w przeciwnym razie będę musiał usunąć większość, jeśli nie wszystkie). Ponadto z tego samego powodu powstrzymam się od zgłaszania fragmentów kodu. Przepraszam za to. Kup książkę, aby przeczytać o uzasadnieniu opartym na danych.
Numery stron w nawiasach w dalszej części.
NOT NULL Constraint (11)
Najważniejszym ograniczeniem kolumny jest NOT NULL, które zabrania używania wartości NULL w kolumnie. Używaj tego ograniczenia rutynowo i usuwaj je tylko wtedy, gdy masz dobry powód. Pomoże Ci to uniknąć komplikacji związanych z wartościami NULL podczas wykonywania zapytań dotyczących danych.
To nie jest wartość ; jest to znacznik, który utrzymuje miejsce, do którego może trafić wartość.
Znowu ten nonsens „wartość, ale niezupełnie wartość”. Reszta wydaje mi się całkiem rozsądna.
(12)
Krótko mówiąc, wartości NULL powodują wiele nieregularnych funkcji w języku SQL, które omówimy później. Najlepszym rozwiązaniem jest po prostu zapamiętanie sytuacji i zasad dotyczących zerowych wartości, jeśli nie możesz ich uniknąć.
A propos SQL, NULL i Infinite:
(104) ROZDZIAŁ 3: DANE NUMERYCZNE W SQL
SQL nie zaakceptował modelu IEEE dla matematyki z kilku powodów.
...
Gdyby reguły IEEE dla matematyki były dozwolone w języku SQL, potrzebowalibyśmy reguł konwersji typów dla nieskończoności i sposobu reprezentowania nieskończonej dokładnej wartości liczbowej po konwersji. Ludzie mają dość problemów z wartościami NULL, więc nie idźmy tam.
Implementacje SQL nie zdecydowały, co tak naprawdę oznacza NULL w określonych kontekstach:
3.6.2 Funkcje wykładnicze (116)
Problem polega na tym, że logarytmy są niezdefiniowane, gdy (x <= 0). Niektóre implementacje SQL zwracają komunikat o błędzie, inne zwracają wartość NULL i DB2 / 400; wersja 3 wydanie 1 zwróciła jako wynik * NEGINF (skrót od „ujemna nieskończoność”).
Joe Celko cytujący Davida McGoverana i CJ Date:
6 wartości NULL: brakujące dane w języku SQL (185)
W swojej książce A Guide to Sybase and SQL Server David McGoveran i CJ Date powiedzieli: „W opinii tego autora NULL-y, przynajmniej tak jak obecnie zdefiniowano i zaimplementowano w SQL, są o wiele większym kłopotem niż są warte i należy ich unikać; zachowują się bardzo dziwnie i niespójnie i mogą być bogatym źródłem błędów i nieporozumień. (Należy pamiętać, że te komentarze i krytyka dotyczą każdego systemu obsługującego wartości NULL w stylu SQL, a nie tylko SQL Servera) ”.
NULL jako narkomania :
(186/187)
W pozostałej części tej książki będę was zachęcać, abyście ich nie używali , co może wydawać się sprzeczne, ale tak nie jest. Pomyśl o NULL jako leku; używaj go właściwie i działa dla ciebie, ale nadużywaj go i może zepsuć wszystko. Najlepszą zasadą jest unikanie wartości NULL, kiedy możesz, i właściwe ich używanie, gdy musisz.
Moim jedynym zastrzeżeniem jest „właściwe ich używanie”, co źle współgra z określonymi zachowaniami implementacyjnymi.
6.5.1 NULLS w predykatach podzapytań (191/192)
Ludzie zapominają, że podzapytanie często ukrywa porównanie z wartością NULL. Rozważ te dwie tabele:
...
Wynik będzie pusty. Jest to sprzeczne z intuicją , ale poprawne.
(separator)
6.5.2 Standardowe rozwiązania SQL (193)
SQL-92 rozwiązał niektóre problemy z logiką trójwartościową (3VL), dodając nowy predykat postaci:
<warunek wyszukiwania> JEST [NIE] PRAWDA | FALSE | NIEZNANY
Ale NIEZNANY sam w sobie jest źródłem problemów, dlatego CJ Date w cytowanej poniżej książce zaleca w rozdziale 4.5. Unikanie wartości null w SQL :
- Nie używaj słowa kluczowego UNKNOWN w żadnym kontekście.
Przeczytaj „ASIDE” w UNKNOWN, do której link znajduje się poniżej.
6.8 NULL i języki hosta (194)
Powinieneś jednak wiedzieć, jak obsługiwane są wartości NULL, gdy muszą zostać przekazane do programu hosta. Żaden standardowy język hosta, dla którego zdefiniowano osadzanie, nie obsługuje wartości NULL, co jest kolejnym dobrym powodem, aby unikać ich używania w schemacie bazy danych.
(separator)
6.9 Wskazówki projektowe dla NULL (195)
Dobrym pomysłem jest zadeklarowanie wszystkich tabel podstawowych z ograniczeniami NOT NULL we wszystkich kolumnach, gdy tylko jest to możliwe. Wartości NULL dezorientują ludzi, którzy nie znają języka SQL, a wartości NULL są drogie.
Zarzut: wartości NULL dezorientują nawet osoby dobrze znające SQL, patrz poniżej.
(195)
Należy unikać wartości NULL w kluczach obcych. SQL dopuszcza tę relację „korzyści z wątpliwości”, ale może spowodować utratę informacji w zapytaniach, które obejmują łączenie. Na przykład, biorąc pod uwagę kod numeru części w magazynie, który jest określany jako KLUCZ OBCY w tabeli Zamówienia, będziesz mieć problemy z wyświetleniem listy części, które mają wartość NULL. To jest obowiązkowy związek; nie możesz zamówić części, która nie istnieje.
(separator)
6.9.1 Unikanie wartości NULL w programach głównych (197)
Możesz uniknąć umieszczania wartości NULL w bazie danych z programów głównych z pewną dyscypliną programowania.
...
- Określ wpływ brakujących danych na programowanie i raportowanie:
Kolumny liczbowe z wartościami NULL stanowią problem, ponieważ zapytania korzystające z funkcji agregujących mogą dawać mylące wyniki.
(separator)
(227)
SUMA () pustego zestawu ma zawsze wartość NULL. Jednym z najczęstszych błędów programistycznych popełnianych podczas korzystania z tej sztuczki jest napisanie zapytania, które może zwrócić więcej niż jeden wiersz. Gdybyś o tym nie pomyślał, mógłbyś napisać ostatni przykład jako: ...
(separator)
10.1.1 Źródła wartości NULL (242)
Należy pamiętać, gdzie mogą wystąpić wartości NULL. Są czymś więcej niż tylko możliwą wartością w kolumnie . Funkcje agregujące na pustych zbiorach, OUTER JOIN, wyrażeniach arytmetycznych z wartościami NULL i operatorach OLAP zwracają wartości NULL. Konstrukcje te często pojawiają się jako kolumny w WIDOKACH.
(separator)
(301)
Inny problem z wartościami NULL występuje podczas próby konwersji predykatów IN na predykaty EXISTS.
(separator)
16.3 WSZYSTKIE funkcje predykatów i ekstremów (313)
Na początku jest sprzeczne z intuicją, że te dwa predykaty nie są takie same w SQL:
...
Ale musisz pamiętać o regułach dla funkcji extrema - usuwają one wszystkie wartości NULL przed zwróceniem większej lub najmniejszej wartości. Predykat ALL nie usuwa wartości NULL, więc można je uzyskać w wynikach.
(separator)
(315)
Jednak definicja w standardzie jest sformułowana w sposób negatywny, aby wartości NULL zostały uwzględnione w wątpliwościach. ...
Jak widać, dobrym pomysłem jest unikanie wartości NULL w ograniczeniach UNIQUE.
Omówienie GROUP BY:
Wartości NULL są traktowane tak, jakby wszystkie były sobie równe i tworzą własną grupę. Każda grupa jest następnie redukowana do jednego wiersza w nowej tabeli wynikowej, która zastępuje starą.
Oznacza to, że klauzula GROUP BY NULL = NULL nie daje wartości NULL, jak w 3VL, ale przyjmuje wartość TRUE.
Standard SQL jest mylący:
ORDER BY i wartości NULL (329)
Czy wartość klucza sortowania, która wynosi NULL, jest uważana za większą, czy mniejszą od wartości innej niż NULL, jest definiowana przez implementację, ale ...
... Istnieją produkty SQL, które to robią.
W marcu 1999 roku Chris Farrar zadał pytanie jednemu ze swoich programistów, które skłoniło go do zbadania części standardu SQL, o której myślałem, że rozumiem . Chris znalazł pewne różnice między ogólnym zrozumieniem a faktycznym sformułowaniem specyfikacji .
I tak dalej. Myślę, że Celko wystarczy.
Data CJ w SQL NULL
CJ Date jest bardziej radykalnym podejściem do wartości NULL: unikaj wartości NULL w SQL, kropka. W rzeczywistości rozdział 4 jego teorii SQL i teorii relacyjnej: Jak pisać dokładny kod SQL jest zatytułowany „BEZ DUPLIKATÓW, BEZ ZERÓW NULL ”, z podrozdziałami
„4.4 Co jest nie tak z wartościami zerowymi?” oraz „4.5 Unikanie Null w SQL” (kliknij link: dzięki Google Books możesz czytać niektóre strony on-line).
Fabian Pascal na SQL NULL
Z jego praktycznych zagadnień w zarządzaniu bazami danych - odniesienie dla praktyka myślącego (brak fragmentów on-line, przepraszam):
10.3 Praktyczne implikacje
10.3.1 wartości NULL języka SQL
... SQL cierpi na problemy tkwiące w 3VL, a także na wiele dziwactw, komplikacji, sprzecznych z intuicją i oczywistych błędów [10, 11]; wśród nich są:
- Funkcje agregujące (np. SUMA (), AVG ()) ignorują wartości NULL (z wyjątkiem COUNT ()).
- Wyrażenie skalarne w tabeli bez wierszy przyjmuje niepoprawną wartość NULL zamiast 0.
- Wyrażenie „NULL = NULL” przyjmuje wartość NULL, ale w rzeczywistości jest niepoprawne w języku SQL; jednak ORDER BY traktuje wartości NULL jako równe (cokolwiek poprzedzają lub następują po „zwykłych” wartościach, pozostawione jest dostawcy DBMS).
- Wyrażenie „x NIE JEST NULL” nie jest równe „NIE (x JEST NULL)”, jak w przypadku 2VL.
...
Wszystkie komercyjnie wdrażane dialekty SQL są zgodne z tym podejściem 3VL, a zatem nie tylko wykazują te problemy, ale także mają sprecyzowane problemy z implementacją, które różnią się w zależności od produktu .