对比Excel,轻松学习SQL数据分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.1 缺失值处理

我们在数据库中存储的数据一般都会由于各种原因存在缺失值,我们需要对这部分数据进行处理。一般的处理方式有两种:第一种是直接把缺失值过滤掉,第二种是对缺失值进行填充。

1. Excel实现

对第一种处理方式,在Excel中,我们可以通过筛选的方式将非缺失值部分筛选出来,从而就可以得到过滤掉缺失值以后的数据了。

对第二种处理方式,我们可以通过筛选的方式将缺失值部分筛选出来,然后手动填充上我们想要的值。我们也可以通过空值定位条件来对全表中的缺失值进行统一填充。先按Ctrl+G快捷键调出“定位”对话框,然后单击“定位条件”按钮,在弹出的“定位条件”对话框中选择“空值”选项,最后单击“确定”按钮。这样就会把所有的缺失值单元格选中,在第一个缺失值单元格内输入想要填充的值,输入以后按Ctrl+ Enter快捷键就可以对所有缺失值进行填充。

2. SQL实现

对第一种处理方式,在SQL中,我们可以通过where进行过滤,具体实现代码如下:

select
   *
from
   demo.chapter6
where profession != ""

运行上面的代码,我们就可以得到过滤掉缺失值以后的数据,具体运行结果如下表所示。

!=表示不等于,""表示空值,缺失值有空格、null和空值三种表现形式,前两种形式虽然也表示缺失值,但是在对应的单元格内是有值的,而后一种空值是没有值的,表示这个单元格什么都没有。

如果缺失值是用空格表示的,要过滤掉缺失值,where后面就需要改成profession != " ";如果缺失值是用null表示的,要过滤掉缺失值,where后面就需要改成profession is not null。

上面的处理方式把profession列是缺失值的行都过滤掉了,所以这种处理方式会把其他非缺失值的字段过滤掉,而造成数据的浪费。我们可以将profession列中的缺失值填充为其他,而不是直接过滤掉,这就是针对缺失值的第二种处理方式,使用的是coalesce()函数,具体实现代码如下:

select
   order_id
   ,memberid
   ,coalesce(profession,"其他")
from
   demo.chapter6

运行上面的代码,具体运行结果如下表所示。

上面的结果并不是我们想要的,profession列的缺失值并没有填充成其他。

这是因为coalesce()函数的形式为(null,null,...,null,value)。

如果value前面的值均为null,则缺失值被填充为value。我们在前面讲过,用来表示缺失值的空值和null是有区别的,这里面的缺失值是空值而非null,所以coalesce()函数没有生效。

运行下面的代码,就可以得到我们想要的结果:

select coalesce(null,"我是填充值")

运行上面的代码,得到的结果为我是填充值。

对于这种缺失值是空值的情况,我们可以用if条件语句来进行处理,关于if条件语句,后续章节会详细讲述。

读者有没有注意到,上面的代码中只有select,而没有from,按照我们之前的理解,要想select必须先指明从哪里select,也就是应该要有from。可是为什么上面的代码中虽然没有写from,但依然可以得出结果呢?这是因为select部分不需要依赖于任何表的数据,全部是由我们手动填充的,我们只是利用了SQL中提供的功能对我们手动填充的数据进行运算。比如,我们还可以进行如下运算:

select 1 + 1

运行上面的代码,最后得到的结果为2。