在程式語言中,邏輯表示式的值只有兩種:true和false,而在資料庫中卻並非如此。
「關聯式資料庫中起邏輯表示式作用的並非只有兩種,還有一種稱為三值邏輯的表示式」,這裡的三值邏輯表示式指的就是unknow。當在進行真假狀態判斷而又不能明確知道該狀態是true還是false時,那麼它就屬於unknow狀態。那這樣理解也是可以的:它既有可能表示true又有可能表示false--連表示什麼狀態也不知道。所以我們在資料庫應用當中涉及到與null值進行比較的時候就要留意一點。
這是「內幕」中的例子:
(1)mysql> select 0=null;
+--------+
| 0=null |
+--------+
| null |
+--------+
1 row in set
(2)mysql> select null=null;
+-----------+
| null=null |
+-----------+
| null |
+-----------+
1 row in set
(3)mysql> select not null = null;
+-----------------+
| not null = null |
+-----------------+
| null |
+-----------------+
1 row in set
上面例子中的結果都是null,這裡我們應當將null看作是unknown,即表示未知的。有兩種情形認為兩個null是相等的:
(1)group by 子句將所有null值分到一組。
(2)order by 子句將所有null值排列到一組。
這個是不相等的一種情形:
在on過濾條件下的null值比較,比較結果為unknown,會被視為false,即兩個null值並不相同。
「內幕」中的另乙個地方也提到了null與三值邏輯的關係就是exists與in的區別。「在對三值邏輯的判斷上exists總是返回true或false,而對於in,還有另一種可能就是unknown。」因而對於包含了null值的比較過程中not in 總是返回not true 和 not unknown,也就是false和unknow。但對於not exists 其結果只有true和false,這是二者很大區別的乙個地方。
在實際的應用中,如果資料中不含有null值,那麼not exists與not in 除了在底層的執行計畫有細微差別外二者的查詢結果是一致。若資料中含有null值則二者的差別就非常明顯了:not exists依然返回與不含有null值相同的資料,而not in會返回空集合,如果想要排除null值對not in 的影響,使用先過濾掉null值:where。
資料庫的null值
資料庫的null值給我開了乙個小玩笑,同時我也記住了以後遇到這種問題要怎麼處理了。在我的link表中backupid欄位只有2個值 2 和null。現在我想排除掉backupid字段值為2的記錄,剩下所有為null的記錄。我在pl sql中執行如下語句,得不得任何記錄結果 select from l...
資料庫中的NULL(空值)
往往很多人都認為空值與空白或0值是一樣的,至少我在今天以前是這麼認為的,其實空值並不與空白和0值是一回事。null值表示數值未知。沒有兩個相等的空值,比較兩個空值或空值和任意乙個數比較返回的均是未知 下面有以下從sql 聯機叢書中的關於空值的資訊 1 若要測試查詢中的空值,在where 子句中使用i...
golang orm資料庫插入null值
不知道大家在用golang orm框架的時候有沒有遇到過這個問題,比如有表 person 字段 age name,name不能重複所以設定了唯一索引 unique go 結構體 type person struct大家都知道,stirng的預設值為空字串 所以在插入的時候,name預設就被orm框架...