今天在給同事調取資料的時候,同事反饋說資料偏少,我仔細檢查,發現sql語句條件都正確,邏輯沒哪裡不對,最後經過仔細排查,才發現問題出在null欄位上
表中有一列是允許為null值,比如查詢名字不為測試的商戶名字的記錄
我的查詢為 name<>'測試'為10行,
select * from test name<>'測試'
檢查資料 name='測試' 有90行, 總記錄120行,有20行既不滿足<>'測試',也不='測試',這20行記錄name都是null
如下圖所示,一看便明白:
在資料錶行記錄中,資料列中經常會有記錄為null,其實null值表示的是未知資料,即空,表示什麼也沒有,
但不是我們所說的'',也不是表示數值0,而是表示未知資料。可以理解未知資料的點位符
null值的處理方式與其他值不同
null不能參與比較,因為是未知值,所以不能用在比較運算子後面,
name<>null,name=null,都是不正確的,
null值不能比較運算子,那怎麼查詢列值是null的呢,
我們必須使用 IS NULL 和 IS NOT NULL 操作符,
如查詢名字為null 的使用者
--記錄為null SELECT COUNT(1) null記錄數 FROM dbo.Users u WHERE u .Name IS NULL
查詢名字不等於'aaaa'的使用者記錄:
--正確的名字不等於'aaaa' SELECT * FROM dbo.Users u WHERE ISNULL(u.Name,'')<>'aaaa'
實際上這裡已經用到了isnull函式了,
isnull函式有兩個引數,第一引數是要計算的表示式,第二個是當第一個表示式值為空時的替代值。