一文帶你探究MySQL中的NULL
不知道大家有沒有遇到這樣的問題,當我們在對MySQL數(shù)據(jù)庫進行查詢操作時,條件寫的是status!=1,理論上會將所有不符合條件的查詢出來,但奇怪的是結(jié)果為NULL的就查不出來,必須得拼接上條件or status IS NULL。本篇文章我們就一起探究一下MySQL中的NULL。
1 MySQL 中的NULL
對MySQL來說,NULL是一個特殊的值。
NULL表示不可知不確定,NULL不與任何值相等(包括其本身)
2 NULL占用的長度
NULL在數(shù)據(jù)庫中占用的長度
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.
可以看出空值''的長度是0,是不占用空間的;而的NULL長度是NULL,是需要占用額外空間的,所以在一些開發(fā)規(guī)范中,建議將數(shù)據(jù)庫字段設(shè)置為Not NULL,并且設(shè)置默認值''或0。
3 對NULL值的比較
IS NULL 判斷某個字符是否為空,并不代表空字符或者是0
SQL92標準中說道,!=NULL 條件判斷永遠返回false,聚合運算永遠返回0
當然在數(shù)據(jù)庫中可以使用SET ANSI_NULLS OFF關(guān)閉標準模式,但一般不建議這樣去做
所以,要判斷一個數(shù)是否等于NULL只能用 IS NULL 或者 IS NOT NULL 來判斷
4 SQL對NULL值進行處理
MySQL中專門為我們提供了IFNULL(expr1,expr2)這個函數(shù),讓我們可以輕松的處理數(shù)據(jù)中的NULL
IFNULL有兩個參數(shù)。 如果第一個參數(shù)字段不是NULL,則返回第一個字段的值。 否則,IFNULL函數(shù)返回第二個參數(shù)的值(默認值)。
select IFNULL(status,0) From t_user;
5 值為NULL 對查詢條件的影響
- 不能使用=,<,>這樣的運算符,對NULL做算術(shù)運算的結(jié)果都是NULL(所以說當status為NULL時,status!=1不會統(tǒng)計到NULL)
- 使用COUNT(expr) 統(tǒng)計時,也不會統(tǒng)計該字段為NULL的數(shù)據(jù)
6 值為NULL對索引的影響
首先需要注意的一點是,MySQL中某一列數(shù)據(jù)含有NULL,并不一定會造成索引失效。
MySQL可以在含有NULL的列上使用索引
在有NULL值得字段上使用常用的索引,如普通索引、復合索引、全文索引等不會使索引失效。但是在使用空間索引的情況下,該列就必須為 NOT NULL。
7 值為NULL對排序的影響
在ORDER BY排序的時候,如果存在NULL值,那么NULL是最小的,ASC正序排序的話,NULL值是在最前面的
如果我們需要在正序排序時,將NULL值放在后邊,這里我們就需要巧借IS NULL
select * from t_user order by age is null, age; 或者 select * from t_user order by isnull(name), age; # 等價于 select * from (select name, age, (age is null) as isnull from t_user) as foo order by isnull, age;
8 NULL和空值區(qū)別
NULL也就是在字段中存儲NULL值,空值也就是字段中存儲空字符('')。
1、占用空間區(qū)別
mysql> select length(NULL), length(''), length('1'); +--------------+------------+-------------+ | length(NULL) | length('') | length('1') | +--------------+------------+-------------+ | NULL | 0 | 1 | +--------------+------------+-------------+ 1 row in set
小總結(jié):從上面看出空值('')的長度是0,是不占用空間的;而的NULL長度是NULL,其實它是占用空間的,看下面說明。
NULL columns require additional space in the row to record whether their values are NULL.
NULL列需要行中的額外空間來記錄它們的值是否為NULL。
通俗的講:空值就像是一個真空轉(zhuǎn)態(tài)杯子,什么都沒有,而NULL值就是一個裝滿空氣的杯子,雖然看起來都是一樣的,但是有著本質(zhì)的區(qū)別。
總結(jié)
到此這篇關(guān)于MySQL中NULL的文章就介紹到這了,更多相關(guān)MySQL中的NULL內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。