SQL中的数据清洗:如何为分析准备杂乱数据
内容提要
文章介绍用SQL清洗数据:先建employees表并插入含缺失值、格式不一致等问题的记录,再演示用COALESCE处理缺失值、DISTINCT查重、STR_TO_DATE转换日期类型、筛选异常薪资、统一姓名大小写、校验薪资范围,并用现有列派生工龄等新列,强调清洗可提升数据质量与分析有效性。
延伸解读
清洗操作多为查询,不改原表
文章中的清洗示例(如COALESCE处理缺失值、STR_TO_DATE转换日期、统一姓名大小写)均通过SELECT查询实现,不会修改原始表。作者指出,实际工作中可能没有ALTER、UPDATE或DELETE权限,只能以只读方式运行查询。因此,清洗结果通常作为分析用的临时视图或派生表,而非直接更新源数据。
异常值判断依赖领域知识
文章以薪资上限100000为例筛选异常值,但强调判断哪些值属于异常需要领域知识和历史数据。这意味着清洗规则并非通用,不同业务场景下阈值可能不同。读者应注意,直接套用示例中的阈值可能不适用于自己的数据,需结合实际情况定义合理范围。
派生列可提升分析便利性
除了清洗,文章还演示了用现有列派生新列,如根据hire_date计算工龄(years_of_service)。这类操作虽不属于严格的数据清洗,但能生成对分析更有用的字段。作者提醒,派生列同样通过查询实现,若要永久添加列需有ALTER权限。
Q&A
在SQL中处理数据缺失值有哪些常用方法?
可以使用COALESCE()函数将NULL值替换为指定值,例如将department列的NULL替换为'Unknown'。应避免直接删除包含缺失值的记录,除非确定没有更好的处理方式。
如何用SQL检查表中的重复记录?
可以使用SELECT DISTINCT * FROM employees;来查询去重后的所有记录。如果表有主键(如employee_id),则不会出现重复记录。
SQL中如何将字符串类型的日期转换为日期类型?
使用STR_TO_DATE()函数,指定格式字符串,例如STR_TO_DATE(hire_date, '%Y-%m-%d'),可将VARCHAR类型的日期转换为日期类型,便于后续日期操作。
在SQL中如何识别和处理异常值(离群值)?
可以通过查询筛选出超出合理范围的值,例如SELECT * FROM employees WHERE salary > 100000;来识别薪资异常高的记录。处理异常值需要结合领域知识决定是否删除或修正。
如何用SQL统一姓名的大小写格式?
可以结合CONCAT、UPPER、SUBSTRING和LOCATE函数,将姓和名的首字母大写,其余字母小写,例如生成标题格式的姓名。
SQL中如何验证数值列的范围是否合理?
使用WHERE子句检查数值是否在预期范围内,例如SELECT * FROM employees WHERE salary < 0 OR salary > 100000;来找出超出0到100000范围的薪资记录。
如何基于现有列在SQL中派生新列?
可以使用现有列计算新列,例如用YEAR(CURDATE()) - YEAR(hire_date)计算工龄(years_of_service),但注意这不会修改原表,除非有ALTER权限。