外部ソースからデータを取り込むのって、仲間を仕事に誘うみたいなもんだよね。みんながちゃんとした気持ちで来てるか(つまり、正しいフォーマットか)確認したいわけ。アップロードするファイルにちょっとしたミスがあるだけで、何時間もデバッグしたり、クエリの結果がおかしくなったり、テーブルのデータが台無しになったりするんだ。
たまに、ファイルに空行や余計なスペース、重複、たとえば数字のはずのところにテキストが混じってたりすることもある。しかもエンコーディングが合ってないと、テーブルがファイルの受け入れ自体を拒否することもあるよ。
そうならないためにも、データをアップロードする前か直後に、正確性をちゃんとチェックするのが大事。今から、そのやり方を見ていこう!
データ構造のチェック
- テーブル構造とアップロードデータの比較
まず最初のステップは、データがテーブルの構造に合ってるか確認すること。たとえば、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ファイルの構造がテーブルと合ってなかったら、アップロード時点でエラーが出るはず。でも、エラーが出なかったからって、データが完璧に入ったとは限らないんだ。
- データ型のチェック
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型に変換できない行を表示するよ。
エラーのチェック
- 重複の検索
重複レコードはよくある問題。たとえば、メールアドレス(email)がユニークじゃなきゃいけない場合、重複を探すにはこんなクエリを使おう:
SELECT email, COUNT(*)
FROM students
GROUP BY email
HAVING COUNT(*) > 1;
このクエリで、重複してるemailと、その数がわかる。もしemailカラムがUNIQUE制約付きなら、こういうデータを入れようとするとエラーになるよ。
- 不正データのチェック
たとえばbirth_dateカラムには誕生日だけが入ってるべきだけど、全部が妥当な範囲か確認しよう。例:
SELECT * FROM students
WHERE birth_date < '1900-01-01' OR birth_date > CURRENT_DATE;
このクエリは、現実的じゃない誕生日の行を表示するよ。
不正データの扱い方
問題を見つけたら、次は修正しよう。やり方を見てみよう!
- 不正データの削除
たとえば、名前が空の行があったら、削除できる:
DELETE FROM students
WHERE first_name IS NULL OR last_name IS NULL;
でも、データの削除は慎重に!大事なデータかもしれないから、消すより更新した方がいい場合もあるよ。
- データの更新
もしデータが抜けてる行があったら、他の情報や推測で埋めることもできる。例:
UPDATE students
SET email = 'unknown@example.com'
WHERE email IS NULL;
分析のためのデータ可視化
- 集計関数の利用
データチェックには集計も便利。たとえば、各年に生まれた学生数を調べるには:
SELECT EXTRACT(YEAR FROM birth_date) AS year, COUNT(*)
FROM students
GROUP BY year
ORDER BY year;
このクエリで、年ごとの分布がわかるし、変な年に学生が多すぎるとかの異常も見つけやすい。
- 制約を使ったデータチェック
テーブルに設定した制約にデータが合ってるかも確認しよう。たとえば:
ユニークチェック:
SELECT DISTINCT email
FROM students;
ユニークな値の数が全体の行数より少なかったら、重複があるってこと。
値の範囲チェック:
SELECT * FROM students
WHERE LENGTH(first_name) > 50 OR LENGTH(last_name) > 50;
これで、学生の名前が50文字を超えてないか確認できるよ。
全部ダメだったらどうする?
たまに、データがひどすぎて、もう一回アップロードし直した方が早いこともある。
テーブルから全行を削除:
TRUNCATE TABLE students;PythonやExcelとか、好きなツールで元のCSVファイルを修正しよう。
- もう一度
コマンドでデータをアップロードしよう。
実践での使いどころ
データバリデーションのスキルは、外部データを扱うたびに役立つよ。面接でも、SQLでデータ品質チェックのクエリを書いてって言われること、けっこうある。実際のプロジェクトでも、クライアントや他部署から来るデータはだいたいミスだらけで、最初にそれに気づいて直せるのは君なんだ。バグになる前に直せるのは超大事!
データを定期的にチェックしておくと、DBがきれいに保てるし、これはただの形式じゃなくて、チーム全体の時間やストレス、労力の節約になる。データが大丈夫かすぐに見抜けるようになったら、PostgreSQLマスターへの一歩だよ!
GO TO FULL VERSION