一文帶你探究MySQL中的NULL
前言
不知道大家有沒(méi)有遇到這樣的問(wèn)題,當(dāng)我們?cè)趯?duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行查詢操作時(shí),條件寫的是status!=1,理論上會(huì)將所有不符合條件的查詢出來(lái),但奇怪的是結(jié)果為NULL的就查不出來(lái),必須得拼接上條件or status IS NULL。本篇文章我們就一起探究一下MySQL中的NULL。
1 MySQL 中的NULL
對(duì)MySQL來(lái)說(shuō),NULL是一個(gè)特殊的值。
NULL表示不可知不確定,NULL不與任何值相等(包括其本身)
2 NULL占用的長(zhǎng)度
NULL在數(shù)據(jù)庫(kù)中占用的長(zhǎng)度
mysql> select length(NULL), length(''), length('1'); +--------------+------------+-------------+ | length(NULL) | length('') | length('1') | +--------------+------------+-------------+ | NULL | 0 | 1 | +--------------+------------+-------------+
NULL columns require additional space in the row to record whether their values are NULL.
可以看出空值''的長(zhǎng)度是0,是不占用空間的;而的NULL長(zhǎng)度是NULL,是需要占用額外空間的,所以在一些開發(fā)規(guī)范中,建議將數(shù)據(jù)庫(kù)字段設(shè)置為Not NULL,并且設(shè)置默認(rèn)值''或0。
3 對(duì)NULL值的比較
IS NULL 判斷某個(gè)字符是否為空,并不代表空字符或者是0
SQL92標(biāo)準(zhǔn)中說(shuō)道,!=NULL 條件判斷永遠(yuǎn)返回false,聚合運(yùn)算永遠(yuǎn)返回0
當(dāng)然在數(shù)據(jù)庫(kù)中可以使用SET ANSI_NULLS OFF關(guān)閉標(biāo)準(zhǔn)模式,但一般不建議這樣去做
所以,要判斷一個(gè)數(shù)是否等于NULL只能用 IS NULL 或者 IS NOT NULL 來(lái)判斷
4 SQL對(duì)NULL值進(jìn)行處理
MySQL中專門為我們提供了IFNULL(expr1,expr2)這個(gè)函數(shù),讓我們可以輕松的處理數(shù)據(jù)中的NULL
IFNULL有兩個(gè)參數(shù)。 如果第一個(gè)參數(shù)字段不是NULL,則返回第一個(gè)字段的值。 否則,IFNULL函數(shù)返回第二個(gè)參數(shù)的值(默認(rèn)值)。
select IFNULL(status,0) From t_user;
5 值為NULL 對(duì)查詢條件的影響
- 不能使用=,<,>這樣的運(yùn)算符,對(duì)NULL做算術(shù)運(yùn)算的結(jié)果都是NULL(所以說(shuō)當(dāng)status為NULL時(shí),status!=1不會(huì)統(tǒng)計(jì)到NULL)
- 使用COUNT(expr) 統(tǒng)計(jì)時(shí),也不會(huì)統(tǒng)計(jì)該字段為NULL的數(shù)據(jù)
6 值為NULL對(duì)索引的影響
首先需要注意的一點(diǎn)是,MySQL中某一列數(shù)據(jù)含有NULL,并不一定會(huì)造成索引失效。
MySQL可以在含有NULL的列上使用索引
在有NULL值得字段上使用常用的索引,如普通索引、復(fù)合索引、全文索引等不會(huì)使索引失效。但是在使用空間索引的情況下,該列就必須為 NOT NULL。
7 值為NULL對(duì)排序的影響
在ORDER BY排序的時(shí)候,如果存在NULL值,那么NULL是最小的,ASC正序排序的話,NULL值是在最前面的
如果我們需要在正序排序時(shí),將NULL值放在后邊,這里我們就需要巧借IS NULL
select * from t_user order by age is null, age; 或者 select * from t_user order by isnull(name), age; # 等價(jià)于 select * from (select name, age, (age is null) as isnull from t_user) as foo order by isnull, age;
8 NULL和空值區(qū)別
NULL也就是在字段中存儲(chǔ)NULL值,空值也就是字段中存儲(chǔ)空字符('')。
1、占用空間區(qū)別
mysql> select length(NULL), length(''), length('1'); +--------------+------------+-------------+ | length(NULL) | length('') | length('1') | +--------------+------------+-------------+ | NULL | 0 | 1 | +--------------+------------+-------------+ 1 row in set
小總結(jié):從上面看出空值('')的長(zhǎng)度是0,是不占用空間的;而的NULL長(zhǎng)度是NULL,其實(shí)它是占用空間的,看下面說(shuō)明。
NULL columns require additional space in the row to record whether their values are NULL.
NULL列需要行中的額外空間來(lái)記錄它們的值是否為NULL。
通俗的講:空值就像是一個(gè)真空轉(zhuǎn)態(tài)杯子,什么都沒(méi)有,而NULL值就是一個(gè)裝滿空氣的杯子,雖然看起來(lái)都是一樣的,但是有著本質(zhì)的區(qū)別。
總結(jié)
到此這篇關(guān)于MySQL中NULL的文章就介紹到這了,更多相關(guān)MySQL中的NULL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 獲取當(dāng)天發(fā)布的信息的語(yǔ)句
mysql 獲取當(dāng)天發(fā)布的信息的實(shí)現(xiàn)語(yǔ)句,需要的朋友可以參考下。2010-03-03mysql導(dǎo)入導(dǎo)出數(shù)據(jù)中文亂碼解決方法小結(jié)
本文章總結(jié)了mysql導(dǎo)入導(dǎo)出數(shù)據(jù)中文亂碼解決方法,出現(xiàn)中文亂碼一般情況是導(dǎo)入導(dǎo)入時(shí)編碼的設(shè)置問(wèn)題,我們只要把編碼調(diào)整一致即可解決此方法,下面是搜索到的一些方法總結(jié),方便需要的朋友2012-10-10MySQL數(shù)據(jù)庫(kù)子查詢語(yǔ)法規(guī)則詳解
子查詢是在查詢語(yǔ)句里面再嵌套一個(gè)查詢,這是因?yàn)槲覀冊(cè)谔崛?shù)據(jù)的時(shí)候有很多不知道的數(shù)據(jù)產(chǎn)生了依賴關(guān)系。本文為大家總結(jié)了一下MySQL數(shù)據(jù)庫(kù)子查詢語(yǔ)法規(guī)則,感興趣的可以了解一下2022-08-08淺談mysql的timestamp存在的時(shí)區(qū)問(wèn)題
本文主要介紹了淺談mysql的timestamp存在的時(shí)區(qū)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07淺談Mysql時(shí)間的存儲(chǔ)?datetime還是時(shí)間戳timestamp
本文主要介紹了淺談Mysql時(shí)間的存儲(chǔ)?datetime還是時(shí)間戳timestamp,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07MySQL 的啟動(dòng)選項(xiàng)和系統(tǒng)變量實(shí)例詳解
這篇文章主要介紹了MySQL 的啟動(dòng)選項(xiàng)和系統(tǒng)變量,結(jié)合實(shí)例形式詳細(xì)分析了MySQL 啟動(dòng)選項(xiàng)和系統(tǒng)變量具體原理、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05