当前位置: 首页 > news >正文

利用 MySQL 进行数据清洗

        利用 MySQL 进行数据清洗是数据预处理的重要环节,以下是常见的数据清洗操作及对应 SQL 示例:

1. 去除重复数据

使用 ROW_NUMBER() 或 GROUP BY 识别并删除重复记录。

-- 查找重复记录(以 user_id 和 email 为例)
WITH Duplicates AS (SELECT user_id, email, ROW_NUMBER() OVER (PARTITION BY email ORDER BY user_id) AS rnFROM users
)
SELECT * FROM Duplicates WHERE rn > 1;-- 删除重复记录(保留最新的一条)
DELETE FROM users
WHERE user_id NOT IN (SELECT MAX(user_id) FROM users GROUP BY email
);

2. 处理缺失值

  • 填充默认值:使用 COALESCE() 或 IFNULL()
  • 删除缺失值:使用 WHERE 过滤。
-- 填充缺失值(将 NULL 替换为默认值)
UPDATE products
SET price = COALESCE(price, 0),  -- 价格为 NULL 时填充 0category = IFNULL(category, '未知')  -- 分类为 NULL 时填充 '未知'
WHERE price IS NULL OR category IS NULL;-- 删除包含缺失值的记录
DELETE FROM orders
WHERE customer_id IS NULL;

3. 数据标准化(大小写、格式统一)

  • 转换大小写:使用 UPPER() 或 LOWER()
  • 去除空格:使用 TRIM()
  • 日期格式化:使用 STR_TO_DATE() 或 DATE_FORMAT()
-- 统一邮箱为小写
UPDATE users
SET email = LOWER(TRIM(email));-- 标准化日期格式(将 '2023-12-31' 转为 '31-12-2023')
UPDATE orders
SET order_date = DATE_FORMAT(STR_TO_DATE(order_date, '%Y-%m-%d'), '%d-%m-%Y');

4. 处理无效数据

  • 范围过滤:检查数值是否在合理区间。
  • 正则匹配:验证格式(如邮箱、手机号)。
-- 删除年龄小于 0 或大于 120 的记录
DELETE FROM users
WHERE age < 0 OR age > 120;-- 查找不符合邮箱格式的记录
SELECT * FROM users
WHERE email NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';

5. 数据类型转换

使用 CAST() 或 CONVERT() 转换字段类型。

-- 将字符串类型的价格转为数值类型
ALTER TABLE products
MODIFY price DECIMAL(10, 2) AFTER CAST(price AS DECIMAL(10, 2));

6. 合并 / 拆分字段

  • 合并字段:使用 CONCAT()
  • 拆分字段:使用 SUBSTRING() 或 SUBSTRING_INDEX()
-- 合并姓名(first_name 和 last_name)
UPDATE users
SET full_name = CONCAT(first_name, ' ', last_name);-- 拆分地址(以逗号分隔)
ALTER TABLE customers
ADD street VARCHAR(100),
ADD city VARCHAR(50);UPDATE customers
SET street = SUBSTRING_INDEX(address, ',', 1),city = SUBSTRING_INDEX(address, ',', -1);

7. 异常值处理

通过统计方法(如 Z-score)识别并处理异常值。

-- 计算平均价格和标准差
WITH Stats AS (SELECT AVG(price) AS avg_price,STDDEV(price) AS std_priceFROM products
)
-- 删除价格超过 3 个标准差的异常值
DELETE FROM products
WHERE ABS(price - (SELECT avg_price FROM Stats)) > 3 * (SELECT std_price FROM Stats);

执行建议

  1. 备份数据:清洗前先备份,避免误操作。
  2. 测试逻辑先用 SELECT 验证清洗逻辑,再执行 UPDATE 或 DELETE
  3. 分批处理:大数据量时使用 LIMIT 分批更新,避免锁表。
-- 示例:分批删除重复记录
DELETE FROM users
WHERE user_id IN (SELECT user_id FROM (SELECT user_id, ROW_NUMBER() OVER (PARTITION BY email ORDER BY user_id) AS rnFROM users) tWHERE rn > 1
)
LIMIT 1000;  -- 每次处理 1000 条

http://www.dtcms.com/a/276899.html

相关文章:

  • C++类和对象(一)
  • Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列下载地址--intel_msm_8961002 下载 Version 8.9.6.1002
  • 001_Claude开发者指南介绍
  • UNet改进(22):融合CNN与Transformer的医学图像分割新架构
  • MaxCompute过程中常见的数据倾斜场景以及对应的解决方案
  • std::sort的核心设计思想
  • C++:宏
  • python暑假课第三次作业
  • 从爆红到跑路:AI明星Manus为何仅用四个月就“抛弃”了中国?
  • 详解缓存淘汰策略:LFU
  • macOS - Chrome 关闭自动更新
  • 12.1 MMU配置与管理
  • 人工智能之数学基础:神经网络的矩阵参数求导
  • 基于CMMI的软件质量管理体系深度解析
  • 初级网安作业笔记1
  • 2025上海市“星光计划“信息安全管理与评估赛项二三阶段任务书
  • 【leetcode】字符串,链表的进位加法与乘法
  • 贝叶斯状态空间神经网络:融合概率推理和状态空间实现高精度预测和可解释性
  • 新手向:使用Python构建高效的日志处理系统
  • Linux系统之iprdbg 命令详解
  • 12.4 内存隔离与保护
  • 《Llama: The Llama 3 Herd of Models》预训练数据篇——论文精读笔记
  • Linux | 数据库操作基础
  • EVO-0:具有隐空间理解的视觉-语言-动作模型
  • 维基艺术图片: 构建模型 (3)
  • 应用层协议和JSON的使用
  • 文心大模型4.5开源测评:轻量化部署实践与多维度能力验证
  • 贝尔量子实验设想漏洞
  • 云服务器的基础使用
  • [Dify]-基础入门8- 使用 Dify 创建文档问答机器人(零代码实现)