2020-06-16 13:40:41
审核用的 SQL 是用于检查数据质量、确保数据符合预期的语句,其核心功能是数据校验而非修改,通过“查”而非“改”发现数据问题,最终保障数据的完整性、准确性与一致性。
核心功能详解查找空值或缺失值
真正空值:使用 IS NULL 判断字段是否为空。SELECT * FROM users WHERE name IS NULL OR email IS NULL;
占位符空值:结合 LIKE 或 = 识别特殊字符(如 N/A、Unknown)。SELECT * FROM products WHERE price = 'Unknown' OR description LIKE '%N/A%';
校验数据格式
简单格式:用 LIKE 配合通配符(如 _ 代表单个字符)检查日期、电话等固定格式。SELECT * FROM orders WHERE order_date NOT LIKE '____-__-__'; -- 检查YYYY-MM-DD格式
复杂格式:通过 REGEXP(正则表达式)验证邮箱、身份证号等。SELECT * FROM users WHERE email NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$';
校验数据逻辑
单表逻辑:通过 WHERE 条件发现异常值(如金额为负)。SELECT * FROM orders WHERE amount < 0;
多表关联逻辑:关联表验证数据关系(如订单日期早于用户注册日期)。SELECT * FROM orders o JOIN users u ON o.user_id = u.id WHERE o.order_date < u.registration_date;
检查数据一致性
外键匹配:用 LEFT JOIN + IS NULL 找出外键不匹配的记录。SELECT o.* FROM orders o LEFT JOIN users u ON o.user_id = u.id WHERE u.id IS NULL;
汇总值校验:对比汇总数据与明细加总(如月销售额与每日销售额总和)。SELECT SUM(daily_sales) FROM daily_sales WHERE month = '2023-10';SELECT monthly_sales FROM monthly_summary WHERE month = '2023-10';
找出重复数据
单字段重复:通过 GROUP BY + HAVING 统计重复值。SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;
多字段组合重复:按多列分组判断重复记录。SELECT column1, column2, COUNT(*) FROM table_name GROUP BY column1, column2 HAVING COUNT(*) > 1;
精准定位问题
通过针对性查询快速发现缺失、格式错误、逻辑矛盾或重复数据,避免人工抽检的遗漏。
自动化与可复用性
审核 SQL 可嵌入ETL流程或定时任务,实现自动化校验,且规则可复用,降低维护成本。
支持复杂业务规则
通过多表关联、正则表达式等支持复杂校验逻辑(如跨表时间顺序、格式嵌套验证)。
高效处理大规模数据
结合索引、分区、并行查询等技术优化性能,确保在海量数据中快速返回结果。
迭代完善机制
随业务变化补充校验规则(如新增字段或逻辑),持续保障数据质量。
索引优化
为常用查询字段(如外键、日期、状态)建立索引,减少全表扫描。
分区表设计
按时间、地区等维度分区,缩小查询范围(如仅扫描某月数据)。
并行查询启用
在支持并行查询的数据库(如Oracle、PostgreSQL)中开启并行执行,加速复杂查询。
SQL写法优化
避免 SELECT *,仅查询必要字段;使用 EXISTS 替代子查询;拆分复杂查询为多步操作。
避免全表扫描
通过索引列过滤数据,或使用分区裁剪(Partition Pruning)减少扫描范围。
审核用的 SQL 是数据质量管理的核心工具,通过精准校验缺失值、格式、逻辑、一致性及重复数据,确保数据可靠。其优势在于自动化、可扩展性及支持复杂规则,而高效执行需结合索引、分区、并行查询等技术。编写审核 SQL 需持续迭代,随业务深入不断完善规则,最终构建健壮的数据质量防线。