CodeGym /課程 /SQL SELF /檢查已上傳資料的正確性

檢查已上傳資料的正確性

SQL SELF
等級 24, 課堂 2
開放

從外部來源上傳資料就像找夥伴一起幹大事。你一定想確定大家都帶著正確的心態來——或者說,資料格式都對。就算檔案裡有一點小錯,都可能讓你 debug 好幾個小時、查詢結果怪怪的,甚至直接把資料表搞壞。

有時候檔案裡會混進空白行、多餘的空格、重複資料,或者本來該是數字的地方卻變成文字。如果編碼又不對,資料表甚至會直接拒絕收檔案。

為了避免這種情況,最好一開始就先檢查資料正不正確——不管是在上傳前還是上傳後馬上檢查。現在我們就來看看怎麼做吧。

檢查資料結構

  1. 比對資料表結構和上傳的資料

第一步就是要確定資料有照你的資料表結構上傳。比如你建立了一個 students 資料表來存學生資訊:

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    birth_date DATE,
    email VARCHAR(100) UNIQUE
);

如果你已經把資料上傳到這個表,先來看看裡面有什麼:

SELECT * FROM students;

查詢結果會顯示表裡所有紀錄。如果 CSV 檔的資料結構跟資料表不一樣,你在上傳時就會看到錯誤。不過就算沒錯誤,也不代表資料就一定沒問題。

  1. 檢查資料型別

用 PostgreSQL 的函數來檢查欄位內容。舉例來說:

檢查空值 (NULL):

如果你的資料表有 NOT NULL 必填欄位,你要確定它們真的有填。例如:

SELECT * FROM students WHERE first_name IS NULL OR last_name IS NULL;

檢查資料格式:

有時候資料會被當成字串上傳,其實應該是日期或數字。要檢查這個,可以用 PostgreSQL 的函數,例如:

SELECT * FROM students WHERE birth_date::DATE IS NULL;

這個查詢會顯示 birth_date 欄位不能轉成 DATE 型別的紀錄。

檢查有沒有錯誤

  1. 找重複資料

重複紀錄超常見。假設你的資料應該用 email 當唯一值 (email)。要找重複,可以用這個查詢:

SELECT email, COUNT(*)
FROM students
GROUP BY email
HAVING COUNT(*) > 1;

這個查詢會顯示所有重複的 email,還有它們出現幾次。如果你的 email 欄位設成 UNIQUE,上傳這種資料會直接報錯。

  1. 檢查不正確的資料

如果你預期 birth_date 欄位只會有生日,你要確定所有值都在合理範圍。例如:

SELECT * FROM students
WHERE birth_date < '1900-01-01' OR birth_date > CURRENT_DATE;

這個查詢會顯示生日太誇張的紀錄。

處理不正確的資料

找到問題之後,就要來修正啦。來看看怎麼做。

  1. 刪除不正確的資料

如果發現表裡有名字是空的紀錄,可以直接刪掉:

DELETE FROM students
WHERE first_name IS NULL OR last_name IS NULL;

但刪資料要小心!有時候這些資料很重要,也許你該考慮更新而不是直接刪掉。

  1. 更新資料

如果你找到有缺資料的紀錄,可以根據其他來源或猜測來補。例如:

UPDATE students
SET email = 'unknown@example.com'
WHERE email IS NULL;

用資料視覺化來分析

  1. 用聚合函數

有時候檢查資料時,算一下聚合值很有幫助。比如想知道每年出生的學生有多少,可以這樣查:

SELECT EXTRACT(YEAR FROM birth_date) AS year, COUNT(*)
FROM students
GROUP BY year
ORDER BY year;

這個查詢會顯示每年的人數分布,也可以看出有沒有哪一年學生特別多(可能有問題)。

  1. 用限制條件檢查資料

確定資料有符合表裡設定的限制,比如這樣:

檢查唯一性:

SELECT DISTINCT email
FROM students;

如果唯一值的數量比總行數少——你就有重複資料啦。

檢查值的範圍:

SELECT * FROM students
WHERE LENGTH(first_name) > 50 OR LENGTH(last_name) > 50;

這可以幫你確定學生名字沒超過 50 個字元的限制。

如果一切都爛掉怎麼辦?

有時候資料爛到爆,重上傳比較快。

  1. 把表裡所有資料都刪掉:

    TRUNCATE TABLE students;
    
  2. 用 Python、Excel 或其他工具修好原始 CSV 檔。

  3. 再用 COPY 指令重新上傳資料。

實戰應用

每次你跟外部資料打交道,資料驗證技巧都超有用。像面試時,面試官很常要你寫 SQL 查詢來檢查輸入資料品質——這很常見。在實際專案裡,情況也一樣:客戶或其他部門給的資料幾乎都會有錯,通常你就是第一個發現問題、第一個能修好的人,這樣 bug 就不會發生啦。

定期檢查資料可以讓你的資料庫一直很乾淨——這不是形式,是能幫整個團隊省下超多時間、精力和心力的真本事。所以只要你能很快看出資料有沒有問題——你就離 PostgreSQL 大師又近一步啦!

2
任務
SQL SELF, 等級 24, 課堂 2
上鎖
檢查是否有空值
檢查是否有空值
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION