SQL中的NULL是標記而不是值

在SQL中,經常會碰到NULL的數據,由於編程語言如C、C++、C#、JAVA等都有NULL,於是會理所當然的將兩者等價,實際上兩者是不等價的。在C、C++、C#、JAVA等語中,NULL其實是作爲值而存在的。比如C#中創建一個對象Object,我們可以賦值爲null,而此時有一點很明確就是這個數據是Object類型。但在SQL中,數據爲NULL卻是未知的類型,或許有人會說了數據庫的列在設計的時候,我們是有設定類型的,比如NVARCHAR、VARCHAR、INT等類型,而且勾選了【允許NULL】之後,就可以存入NULL的數據,所以NULL是值。然而實際卻非如此的,允許NULL只是標記說這個數據可以爲NULL,而NULL實際並不是真正的值,而是NULL標記。

如果有了這樣的認識,那麼我們對查詢數據的時候,就會很容易理解 =NULL和IS NULL的區別。

=NULL這樣的SQL語句,等號表示的是對值的判斷,所以必須是值才能判斷,而NULL是標記,所以根本不可能判斷出來。那麼【=NULL】計算出來的糾結是什麼值呢?是UNKNOWN。是一個不確定的值。因爲是不確定的,所以將=NULL作爲WHERE條件查詢時,是得不到期望的結果的。

我們也可以這麼理解,等號的判斷是布爾類型的,正常的邏輯是隻有true和false,而實際中非true即false的情況是不能覆蓋所有可能的,因爲還有一種是不確定的。比如前面走來一個人,正常的邏輯是這個人不是男的就是女的,但是在沒有辨析確定之前,是男是女是不確定的,換句語說存在第三種狀態。而=NULL就像這三種狀態。同理使用>NULL、<NULL、<>NULL等的值類型判斷都會是這樣的情況。所以當我們所=NULL這樣的邏輯作SQL的一部分時就會有預想不到的結果。

而使用IS NULL則不然,IS是對一件事是或否的邏輯判斷,NULL是標記,所以IS NULL就是判斷該數據是否爲NULL的標記。也可以說IS NULL是一個整體,就是有來判斷是否爲NULL數據的。

對於有unknown數據參入的邏輯判斷中,就會影響實際的結果。

如果是NOT的邏輯,這個容易理解,就是“不是”。如果有NOT NULL,那邏輯就是不是NULL的數據。

如果是AND的邏輯,則只要有false,那麼結果就一定是false。在沒有false的時候,只要有unkown就一定是unknown。只有都是true的時候纔是true。即優先順序是false>unkown>true。

如果是OR的邏輯,則只要有true,那麼結果就一定是true。如果沒有true而有unknown則必定是unknown。即優先順序是true>unkown>false。

以上內容可參考《SQL進階教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章