帶你學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 nullis 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;

結果如下:
在這裏插入圖片描述
  

   

關注微信公衆號『數據分析與統計學之美』,後臺回覆“入羣”拉你入羣交流哦,氣氛槓槓的!看到這裏,麻煩您點個再看,讓更多朋友看到哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章