MySQL系列關於NUll值的經驗總結分析教程
1.測試數據
create table test_null ( id int, name varchar(20), chinese int, math int, english int ) charset=utf8; insert into test_null values (1,null,80,70,68), (2,'張三',60,null,null), (3,'李四',null,90,80), (4,'王五',90,60,75), (5,null,null,50,95);
結果如下:
2.null值帶給我們的不便影響
1)過濾有所不同,隻能使用is null或者is not null;
# null值不能使用 == 或 != 來比較 # 下面兩種用法都是錯誤的 select * from test_null where name == null; select * from test_null where name != null; # null值一般使用 is null 或 is not null 來比較 # 下面兩種用法才是正確的 select * from test_null where name is null; select * from test_null where name is not null;
2)出現null值,會導致+ – * /運算失效;
select *,(chinese+math+english) as 總分 from test_null;
結果如下:
3)null值對聚合函數無影響,聚合函數會直接忽略null值;
select sum(chinese) 語文總分, sum(math) 數學總分, sum(english) 外語總分 from test_null
結果如下:
3.空格、空值和null,我們應該怎麼判斷呢?
1)空格、空值和null的區別
用一個形象的比喻來說明這三者的區別。首先空格很好理解,一個空字符串嗎,占據一定的空間大小。不好理解的其實是空值和null,空值相當於一個杯子是真空狀態的,什麼也沒有,null表示的杯子中有空氣。
MySQL中,null
是未知的,且占用空間的。null使得索引、索引統計和值都更加復雜,並且影響優化器的判斷。空值('')
是不占用空間的,註意空值的”之間是沒有空格的。在進行count()
統計某一列記錄數的時候,如果存在null
值,會被系統自動忽略掉,但是空值會被統計到其中。判斷null使用的是is null
和 is not null
,但判斷空字符使用的是= ,!=, <>
來進行處理。對於timestamp
數據類型,如果插入null值
,則出現的值是當前系統時間。插入空值,則會出現0000-00-00 00:00:00
。對於已經創建好的表,普通的列將null
修改為not null
帶來的性能提升較小,所以調優時候沒有比要註意。
2)出現瞭null值,我應該怎麼辦?
通過上面的分析我們已經知道瞭,當表中存在null值,會導致加、減、乘、除運算失效。那麼我們怎麼處理這些null值比較好呢?
第一種方式:直接使用is not null將這些null值過濾掉,但是這樣會將其它非缺失值的字段過濾掉,造成數據的浪費。
第二種方式:也是我們推薦的方式,我們使用函數進行缺失值的填充。
ifnull()和coalesce()函數的使用:
select id, coalesce(name,'無名氏') name, coalesce(chinese,0) chinese, ifnull(math,0) math, ifnull(english,0) english from test_null;
結果如下:
以上就是MySQL系列關於NUll值的經驗總結分析的詳細內容,更多關於MySQL中的NUll值的資料請關註WalkonNet其它相關文章!