CodeGym /课程 /SQL SELF /检查已导入数据的正确性

检查已导入数据的正确性

SQL SELF
第 24 级 , 课程 2
可用

从外部来源导入数据就像叫一帮小伙伴来搞事情。你肯定想确保大家都带着对的心态来——或者说,数据格式都对。哪怕导入文件里有个小错误,都可能让你调试半天、查出来的结果不对,甚至直接把表里的数据搞坏。

有时候文件里会混进空行、多余的空格、重复,或者比如本来该是数字的地方却是文本。要是编码还不对,表可能直接拒绝接收这个文件。

为了避免这些坑,最好提前检查下数据是不是靠谱——可以在导入前,也可以刚导完就查。下面咱们就来聊聊怎么搞。

检查数据结构

  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应该唯一。要查有没有重复,可以用这个查询:

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高手又近了一步!

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION