在数据仓库和报表系统的建设中,ETL是最基础也最繁琐的一环。SQL视图作为一种虚拟表,能够把复杂的查询逻辑封装起来,在抽取、转换、加载三个阶段都扮演重要角色。合理利用视图,可以让ETL流程更清晰、更易维护。

一、SQL视图在抽取阶段的作用
抽取阶段通常要从业务库拉取数据。如果源表结构复杂,或者只需要部分字段,可以建立视图来限定范围和格式。
- 屏蔽敏感字段,只暴露需要的列
- 提前过滤历史无效数据,减少传输量
- 统一不同源表的字段命名
例如只抽取订单表中近一年的有效记录:
CREATE VIEW v_order_extract AS SELECT order_id, user_id, amount, create_time FROM orders WHERE status = 1 AND create_time >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
二、SQL视图在转换阶段的作用
转换是ETL的核心,包括清洗、关联、计算指标等。把转换逻辑写成视图,相当于构建了可复用的中间层。
1. 多表关联与字段加工
将订单和用户表关联,并计算出用户所在城市:
CREATE VIEW v_order_transform AS SELECT o.order_id, o.amount, u.city, CASE WHEN o.amount > 1000 THEN 'high' ELSE 'normal' END AS level FROM v_order_extract o LEFT JOIN users u ON o.user_id = u.id;
2. 数据质量处理
利用视图统一空值处理规则,避免下游各自写逻辑:
CREATE VIEW v_order_clean AS SELECT order_id, COALESCE(city, 'unknown') AS city, amount FROM v_order_transform;
三、SQL视图在加载阶段的作用
加载阶段把处理好的数据写入目标表。视图本身不存数据,但可以作为写入源,让加载语句非常简洁。
以下代码将清洗后的数据导入数据仓库的订单明细表:
INSERT INTO dw_order_detail (order_id, city, amount, level) SELECT order_id, city, amount, level FROM v_order_clean;
四、使用视图的注意事项
| 事项 | 说明 |
|---|---|
| 性能 | 嵌套视图过多会导致执行计划复杂,建议控制层级 |
| 权限 | 给ETL账号只授予视图的查询权限,保障安全 |
| 物化 | 若查询慢,可考虑数据库提供的物化视图能力 |
五、小结
SQL视图在ETL中不是替代工具,而是分层设计的好帮手。抽取视图限定来源,转换视图沉淀规则,加载视图简化写入。把重复逻辑放进视图,团队开发和运维都会轻松很多。