SQL数据清洗需先识别再分类后处置空值与异常值:空值分NULL和空字符串分别查询并统计缺失率;关键字段为空则删除,数值型填0或均值,分类字段填'unknown';异常值依业务规则界定并标记后谨慎处理。

SQL业务数据清洗中,空值和异常值是影响分析结论准确性的两大核心问题。处理不能一删了之,需结合业务逻辑判断:空值是否代表“未发生”还是“数据丢失”,异常值是否真实存在还是录入错误。关键在于先识别、再分类、后处置。
识别空值:分字段检查 + 统计比例
空值不是简单的“空白”,而是数据库中的 NULL 或空字符串(''),二者含义不同,需分开查:
- 查 NULL 值:用
IS NULL,例如SELECT * FROM orders WHERE amount IS NULL; - 查空字符串:用
= '',例如SELECT * FROM users WHERE phone = ''; - 统计各字段缺失率:便于优先处理关键字段,例如
SELECTCOUNT(*) AS total,COUNT(user_id) AS user_id_nonnull,1 - COUNT(user_id)/COUNT(*) AS user_id_null_ratioFROM userbehavior;
处置空值:按字段重要性选择策略
不建议全局删除,应分场景处理:
- 关键字段(如订单ID、用户ID)为空 → 直接删除整行:
DELETE FROM orders WHERE order_id IS NULL; - 数值型字段(如销售额、数量)可填充为 0 或均值:
UPDATE sales SET revenue = COALESCE(revenue, 0); - 分类字段(如渠道来源、商品类目)宜填充为
'unknown'或'other',保留维度可用性:UPDATE userbehavior SET source = COALESCE(source, 'unknown'); - 时间字段为空且无法推断 → 不建议填默认值,可设为 NULL 并在后续分析中显式过滤
识别异常值:从业务规则出发定义边界
异常 ≠ 错误,要靠业务常识划界。例如:
- 年龄字段:
WHERE age 120 - 下单时间早于注册时间:需关联两张表做逻辑校验
- 单笔订单金额远超历史均值 5 倍以上:用子查询计算阈值:
SELECT * FROM orders WHERE amount > (SELECT AVG(amount)*5 FROM orders); - 行为时间戳超出业务周期(如只跑 2017-11 至 12 月数据):
WHERE FROM_UNIXTIME(`timestamp`, '%Y-%m-%d') NOT BETWEEN '2017-11-25' AND '2017-12-03';
处置异常值:保留证据,慎用 DELETE
推荐先标记再处理,避免误删:
- 新增标记列记录问题类型:
ALTER TABLE userbehavior ADD COLUMN clean_flag VARCHAR(20); - 将疑似异常行打标:
UPDATE userbehavior SET clean_flag = 'age_outlier' WHERE age 120; - 对确认错误的数据,再执行清理:
DELETE FROM userbehavior WHERE clean_flag = 'age_outlier'; - 对存疑但可能真实的数据(如超高客单价),改用
CASE WHEN替换为上限值:SELECT item_id, CASE WHEN price > 10000 THEN 10000 ELSE price END AS clean_price FROM products;










