利用 MySQL 進(jìn)行數(shù)據(jù)清洗的操作方法
利用 MySQL 進(jìn)行數(shù)據(jù)清洗是數(shù)據(jù)預(yù)處理的重要環(huán)節(jié),以下是常見的數(shù)據(jù)清洗操作及對應(yīng) SQL 示例:

1. 去除重復(fù)數(shù)據(jù)
使用 ROW_NUMBER() 或 GROUP BY 識別并刪除重復(fù)記錄。
-- 查找重復(fù)記錄(以 user_id 和 email 為例)
WITH Duplicates AS (
SELECT
user_id,
email,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY user_id) AS rn
FROM users
)
SELECT * FROM Duplicates WHERE rn > 1;
-- 刪除重復(fù)記錄(保留最新的一條)
DELETE FROM users
WHERE user_id NOT IN (
SELECT MAX(user_id)
FROM users
GROUP BY email
);2. 處理缺失值
- 填充默認(rèn)值:使用
COALESCE()或IFNULL()。 - 刪除缺失值:使用
WHERE過濾。
-- 填充缺失值(將 NULL 替換為默認(rèn)值)
UPDATE products
SET price = COALESCE(price, 0), -- 價格為 NULL 時填充 0
category = IFNULL(category, '未知') -- 分類為 NULL 時填充 '未知'
WHERE price IS NULL OR category IS NULL;
-- 刪除包含缺失值的記錄
DELETE FROM orders
WHERE customer_id IS NULL;3. 數(shù)據(jù)標(biāo)準(zhǔn)化(大小寫、格式統(tǒng)一)
- 轉(zhuǎn)換大小寫:使用
UPPER()或LOWER()。 - 去除空格:使用
TRIM()。 - 日期格式化:使用
STR_TO_DATE()或DATE_FORMAT()。
-- 統(tǒng)一郵箱為小寫 UPDATE users SET email = LOWER(TRIM(email)); -- 標(biāo)準(zhǔn)化日期格式(將 '2023-12-31' 轉(zhuǎn)為 '31-12-2023') UPDATE orders SET order_date = DATE_FORMAT(STR_TO_DATE(order_date, '%Y-%m-%d'), '%d-%m-%Y');
4. 處理無效數(shù)據(jù)
- 范圍過濾:檢查數(shù)值是否在合理區(qū)間。
- 正則匹配:驗(yàn)證格式(如郵箱、手機(jī)號)。
-- 刪除年齡小于 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. 數(shù)據(jù)類型轉(zhuǎn)換
使用 CAST() 或 CONVERT() 轉(zhuǎn)換字段類型。
-- 將字符串類型的價格轉(zhuǎn)為數(shù)值類型 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. 異常值處理
通過統(tǒng)計方法(如 Z-score)識別并處理異常值。
-- 計算平均價格和標(biāo)準(zhǔn)差
WITH Stats AS (
SELECT
AVG(price) AS avg_price,
STDDEV(price) AS std_price
FROM products
)
-- 刪除價格超過 3 個標(biāo)準(zhǔn)差的異常值
DELETE FROM products
WHERE ABS(price - (SELECT avg_price FROM Stats)) > 3 * (SELECT std_price FROM Stats);執(zhí)行建議
- 備份數(shù)據(jù):清洗前先備份,避免誤操作。
- 測試邏輯:先用
SELECT驗(yàn)證清洗邏輯,再執(zhí)行UPDATE或DELETE。 - 分批處理:大數(shù)據(jù)量時使用
LIMIT分批更新,避免鎖表。
-- 示例:分批刪除重復(fù)記錄
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 rn
FROM users
) t
WHERE rn > 1
)
LIMIT 1000; -- 每次處理 1000 條索引:
索引是數(shù)據(jù)庫中用于提高查詢效率的關(guān)鍵工具,它類似書籍的目錄,可以快速定位到數(shù)據(jù)的位置。
1. 索引的作用
加速查詢:通過索引,數(shù)據(jù)庫無需掃描全量數(shù)據(jù),直接定位到符合條件的記錄。
優(yōu)化排序:索引通常已排序,可避免額外的排序操作。
強(qiáng)制唯一性:唯一索引(如主鍵)可防止重復(fù)數(shù)據(jù)。
2. 索引的原理
數(shù)據(jù)結(jié)構(gòu):常見的索引使用 B-Tree(MySQL InnoDB)或哈希表(Memory 引擎)。
存儲方式:索引單獨(dú)存儲,包含鍵值和指向數(shù)據(jù)行的物理地址。
到此這篇關(guān)于利用 MySQL 進(jìn)行數(shù)據(jù)清洗的操作方法的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)清洗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL主庫binlog(master-log)與從庫relay-log關(guān)系代碼詳解
這篇文章主要介紹了MySQL主庫binlog與從庫relay-log關(guān)系的相關(guān)內(nèi)容,涉及部分代碼,需要的朋友可以參考。2017-10-10
MySQL之使用UNION和UNION ALL合并兩個或多個SELECT語句的結(jié)果集
這篇文章主要介紹了MySQL之使用UNION和UNION ALL合并兩個或多個SELECT語句的結(jié)果集,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
Ubuntu Server 16.04下mysql8.0安裝配置圖文教程
這篇文章主要為大家詳細(xì)介紹了Ubuntu Server 16.04下mysql8.0安裝配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Mysql刪除重復(fù)數(shù)據(jù)保留最小的id 的解決方法
這篇文章主要介紹了Mysql刪除重復(fù)數(shù)據(jù)保留最小的id 的解決方法,需要的朋友可以參考下2017-10-10
mysql 5.6.23 winx64.zip安裝詳細(xì)教程
這篇文章主要介紹了mysql 5.6.23 winx64.zip安裝詳細(xì)教程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02
mysql lpad函數(shù)和rpad函數(shù)的使用詳解
MySQL中的LPAD和RPAD函數(shù)用于字符串填充,LPAD從左至右填充,RPAD從右至左填充,兩者都可指定填充長度和填充字符,如果填充長度小于原字符串長度,則會截取原字符串相應(yīng)長度的字符2025-02-02

