Excel & SQL | 資料預處理 | 02
上表儲存了order_id(訂單ID)date (下單日期).value(訂單金額)、memberid(會員ID)、age (會員的年齡)、sex(會員的性別)和profession(所在行業資訊)七個欄位。我們把上表中的資料儲存在demo資料庫的chapter6表中。
缺失值處理
我們在資料庫中儲存的資料一般都會由於各種原因存在缺失值,我們需要對這部分資料進行處理。
一般處理方式有兩種:
- 缺失值過濾
- 缺失值填充
缺失值過濾
在SQL中,可以通過where進行過濾。
select * from chapter6 where profession!="";
!=表示不等於,""表示空值,缺失值有空格、null和空值三種表現形式
前兩種形式雖然也表示缺失值,但是在對應單元格內是有值的,而後一種空值是沒有值的,表示這個單元格什麼都沒有。
如果缺失值是用空格表示的要過濾缺失值, where後面就需要改成profession != " "
;如果缺失值是用null表示的,要過濾掉缺失值, where後面就需要改成profession is not null
。
缺失值填充
上面的處理方式把profession列是缺失值的行都過濾掉了,所以這種處理方式會把其他非缺失值的欄位過濾掉,而造成資料的浪費。我們可以將profession列中的缺失值填充為其他,而不是直接過濾掉,這就是針對缺失值的第二種處理方式,使用的是coalesce()函式,具體實現程式碼如下:
select order_id,memberid,coalesce(profession,"其他") from chapter6;
重複值處理
我們在資料庫中儲存的資料有時候也會存在一些重複值,重複值會影響分析結果,所以我們也需要對這部分資料進行處理。
對重複值的處理,我們一般採取的方式是刪除重複值,即只保留重複資料中的一項,其他資料則被刪除。
在SQL中,我們可以使用distinct對查詢出來的全部結果進行刪除重複值的操作,需要注意的是,這裡不是針對全表進行刪除重複值的操作,而是針對查詢出來的全部結果,也就是select distinct後面的具體列進行刪除重複值的操作。如果是select distinct * ,則就是針對全表進行刪除重複值的操作了。
select distinct * from chapter6;
有時候,我們不需要對全表進行刪除重複值的操作,這個時候就可以根據具體需要選擇指定列進行刪除重複值的操作,比如,我們對chapter6表中的order_id列和memberid列進行刪除重複值的操作,具體實現程式碼如下︰
select distinct order_id,memberid from chapter6;
對重複值進行處理,我們除了可以使用distinct,還可以使用group by。
對想要刪除重複值的列進行group by就可以得到刪除重複值後的結果。
select order_id,memberid from chapter6 group by order_id,memberid;
執行上面程式碼,
資料型別轉換
一般我們會根據不同的需求,以及不同的場景對資料型別進行轉換,轉換成我們想要的資料型別。
在SQL中,我們想要更改某一列的資料型別,可以使用cast()和convert()函式。
cast(value as type)
convert(value,type)
上面兩個函式中的type表示某列更改為目標資料後的型別。目標資料型別包括如下表所示幾種。
我們將chapter6表中的age列從整型分別轉化為浮點型(decimal)和字元型(char)。
select age,cast(age as decimal) decimal_age,convert(age,char) char_age from chapter6;
重新命名
—般,公司資料庫中儲存的表的欄位名都是英文形式的,為了讓資料更加清晰,我們一般會將英文欄位名重新命名為中文欄位名﹔;或者一個欄位並不是表中現有的資料,而是通過表中現有的資料計算生成的,這個時候我們也需要對欄位名進行重新命名。
在SQL中,可以通過as來實現。as前面為原始欄位名,as後面為別名。
我們將chapter6表中所有英文欄位名全部重新命名為中文欄位名,具體實現程式碼如下:
select
order_id as "訂單ID",
date as "下單日期",
value as "訂單金額(元)",
memberid as "會員ID",
age as "年齡",
sex as "性別",
profession as "行業"
from chapter6;
當然,上面程式碼中的as是可以省略的,直接以”原始欄位名 新欄位名“的形式也是可以的,但是為了讓程式碼更加可讀,建議不要省略。
小結
缺失值處理
缺失值過濾 where
缺失值可能是 空格 空字元 null
where xx!=""
where xx!=" "
where xx is not null
缺失值填充 coalesce(屬性,填充值)
select order_id,memberid,coalesce(profession,"其他") from chapter6;
重複值處理
distinct 對後面查詢的列都進行去重
select distinct order_id,memberid from chapter6;
group by 要去重哪個列就對哪個列 group by
select order_id,memberid from chapter6 group by order_id,memberid;
資料型別轉換
cast(value as type)
convert(value,type)
select age,cast(age as decimal) decimal_age,convert(age,char) char_age from chapter6;
重新命名
as(可以省略 原欄位名 新欄位名)
select
order_id as "訂單ID",
date as "下單日期",
value as "訂單金額(元)",
memberid as "會員ID",
age as "年齡",
sex as "性別",
profession as "行業"
from chapter6;