NULL概念
公司的DBA強(qiáng)制規(guī)定在創(chuàng)建表時(shí),表中所有的字段必須都是NOT NULL,并根據(jù)業(yè)務(wù)需要給出默認(rèn)值。

這個(gè)規(guī)定起初讓開發(fā)人員有點(diǎn)難受,針對(duì)部分業(yè)務(wù)場(chǎng)景下的字段需要額外多做判斷,但是慢慢的大家也適應(yīng)了。
那么MySQL中NULL值是怎樣的存在,要特殊對(duì)待呢?
很多人將NULL值類比為空字符串'',其實(shí)兩者是完全不同的兩個(gè)概念。
?
NULL值,表示未知的狀態(tài)。?
空字符'',表示一個(gè)確定的狀態(tài),是一個(gè)長(zhǎng)度為0的字符串。? 例如student的name字段如果為NULL,表明當(dāng)前id下我們不知道名字。
? 如果name=='',表明我們知道當(dāng)前id下沒有名字。
NULL操作

上圖中與NULL值進(jìn)行的比較操作,包含NULL值的函數(shù)操作都返回NULL,即都為不確定,不為真。
那么在我們?nèi)粘5腟QL中就不能將這些操作應(yīng)用到NULL上。例如,我們要查找課程號(hào)為NULL的數(shù)據(jù):
使用
select * from student where classId = NULL;是查不到數(shù)據(jù)的。因?yàn)?code>classId = NULL返回的NULL,where 語句只有返回true才會(huì)返回符合條件的數(shù)據(jù)。
- ? MySQL提供了
IS NULL和IS NOT NULL兩個(gè)運(yùn)算符和IFNULL()函數(shù)來幫助處理NULL。

-
? 當(dāng)字段中存在NULL值時(shí),使用一些
聚合函數(shù)需要注意,例如COUNT()、MIN()、SUM()會(huì)`忽略NULL值
student表中的數(shù)據(jù)總條數(shù)為7,但是count(classId)忽略掉了NULL值。
? 當(dāng)使用DISTINCT、GROUP BY或 時(shí)ORDER BY,
所有 NULL值都被視為相等。-
? 當(dāng)使用時(shí)
ORDER BY, NULL值會(huì)首先顯示,如果指定DESC按降序排序,則值會(huì)最后顯示。
?
NULL對(duì)使用索引查詢效率的影響:因?yàn)镹ULL值未知,無法使用比較操作,可能導(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)中,會(huì)使用額外空間存儲(chǔ)那些可能為NULL值的字段,因此帶來空間上的開銷。
NULL值在MySQL中的特殊性,需要開發(fā)人員在了解其特性的情況下正確使用,避免調(diào)入NULL值的陷阱,導(dǎo)致不必要的錯(cuò)誤。
為此DBA直接強(qiáng)制字段NOT NULL,保持一致的表結(jié)構(gòu)設(shè)計(jì)規(guī)則。

