MySQL NULL值是怎樣的存在?

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 NULLIS 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ī)則。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Mysql 基礎(chǔ) /************ * 數(shù)據(jù)庫 * ************/ 1.連接數(shù)據(jù)庫 mysq...
    王利楨閱讀 509評(píng)論 0 1
  • 一、數(shù)據(jù)庫調(diào)優(yōu) 1.1、調(diào)優(yōu)維度 1、索引失效、沒有充分利用到索引——索引建立 2、關(guān)聯(lián)查詢太多JOIN(設(shè)計(jì)缺陷...
    紫荊秋雪_文閱讀 227評(píng)論 0 0
  • 數(shù)據(jù)庫初識(shí)與基本查詢 1、數(shù)據(jù)庫的本質(zhì)就是文件: 讀文件勢(shì)必產(chǎn)生IO流,但好在數(shù)據(jù)庫有很多已經(jīng)寫好的流程可以幫我們...
    ast_Shlyn閱讀 286評(píng)論 0 0
  • MySQL不熟悉知識(shí)點(diǎn) 一、基礎(chǔ)部分 insert操作insert into 表名(字段1,字段2) values...
    LJH_9442閱讀 252評(píng)論 0 0
  • MySQL 一直是本人很薄弱的部分,后面會(huì)多輸出 MySQL 的文章貢獻(xiàn)給大家,畢竟 MySQL 涉及到數(shù)據(jù)存儲(chǔ)、...
    Theriseof閱讀 365評(píng)論 0 0

友情鏈接更多精彩內(nèi)容