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;
posted @ 2021-07-07 16:57  RowryCho  阅读(201)  评论(0编辑  收藏  举报