NULL概念
公司的DBA強制規(guī)定在創(chuàng)建表時臭觉,表中所有的字段必須都是NOT NULL昆雀,并根據(jù)業(yè)務(wù)需要給出默認值。
這個規(guī)定起初讓開發(fā)人員有點難受蝠筑,針對部分業(yè)務(wù)場景下的字段需要額外多做判斷狞膘,但是慢慢的大家也適應(yīng)了。
那么MySQL中NULL值是怎樣的存在菱肖,要特殊對待呢客冈?
很多人將NULL值類比為空字符串'',其實兩者是完全不同的兩個概念稳强。
?
NULL值场仲,表示未知的狀態(tài)
。?
空字符''退疫,表示一個確定的狀態(tài)渠缕,是一個長度為0的字符串
。? 例如student的name字段如果為NULL褒繁,表明當(dāng)前id下我們不知道名字亦鳞。
? 如果name=='',表明我們知道當(dāng)前id下沒有名字棒坏。
NULL操作
上圖中與NULL值進行的比較操作燕差,包含NULL值的函數(shù)操作都返回NULL,即都為不確定坝冕,不為真徒探。
那么在我們?nèi)粘5腟QL中就不能將這些操作應(yīng)用到NULL上。例如喂窟,我們要查找課程號為NULL的數(shù)據(jù):
使用
select * from student where classId = NULL;
是查不到數(shù)據(jù)的测暗。因為
classId = NULL
返回的NULL,where 語句只有返回true才會返回符合條件的數(shù)據(jù)磨澡。
- ? MySQL提供了
IS NULL
和IS NOT NULL
兩個運算符和IFNULL()
函數(shù)來幫助處理NULL碗啄。
-
? 當(dāng)字段中存在NULL值時,使用一些
聚合函數(shù)
需要注意稳摄,例如COUNT()稚字、MIN()、SUM()會`忽略NULL值
student表中的數(shù)據(jù)總條數(shù)為7厦酬,但是count(classId)忽略掉了NULL值尉共。
? 當(dāng)使用DISTINCT褒傅、GROUP BY或 時ORDER BY,
所有 NULL值都被視為相等
袄友。-
? 當(dāng)使用時
ORDER BY
, NULL值會首先顯示霹菊,如果指定DESC按降序排序剧蚣,則值會最后顯示。
?
NULL對使用索引查詢效率的影響
:因為NULL值未知旋廷,無法使用比較操作鸠按,可能導(dǎo)致索引無法過濾數(shù)據(jù),而查詢最后不走索引饶碘。
在查詢中使用IS NULL 或者 IS NOT NULL作為查詢條件
目尖,可以讓索引得到利用。例如:
select * from student where classId = 102
變成select * from student where classId is not null and classId = 102
;? 在MySQL中的
記錄結(jié)構(gòu)
中扎运,會使用額外空間
存儲那些可能為NULL值的字段瑟曲,因此帶來空間上的開銷。
NULL值在MySQL中的特殊性豪治,需要開發(fā)人員在了解其特性的情況下正確使用
洞拨,避免調(diào)入NULL值的陷阱,導(dǎo)致不必要的錯誤负拟。
為此DBA直接強制字段NOT NULL烦衣,保持一致的表結(jié)構(gòu)設(shè)計規(guī)則。