本文档介绍如何在 TDSQL Boundless 数据库中使用视图。视图是基于 SQL 查询定义的虚拟表,它本身不存储数据,而是在每次查询时动态执行底层的 SQL 语句生成结果。
视图的主要用途:
简化复杂查询:将多表连接、聚合等复杂查询封装为虚拟表,后续使用时像查询普通表一样简洁。
数据安全:只向用户暴露特定字段,隐藏底层敏感数据。
逻辑复用:将通用的查询逻辑定义为视图,避免在多处重复编写相同的 SQL。
创建视图
使用
CREATE VIEW 语句创建视图。创建一个客户订单汇总视图,包含每个客户的订单数量和总金额:
CREATE VIEW customer_order_summary ASSELECTc.c_custkey,c.c_name,c.c_mktsegment,COUNT(o.o_orderkey) AS order_count,COALESCE(SUM(o.o_totalprice), 0) AS total_spentFROM customer cLEFT JOIN orders o ON c.c_custkey = o.o_custkeyGROUP BY c.c_custkey, c.c_name, c.c_mktsegment;
创建一个区域供应商视图,展示各区域的供应商信息:
CREATE VIEW regional_suppliers ASSELECTr.r_name AS region_name,n.n_name AS nation_name,s.s_suppkey,s.s_name AS supplier_name,s.s_phoneFROM region rINNER JOIN nation n ON r.r_regionkey = n.n_regionkeyINNER JOIN supplier s ON n.n_nationkey = s.s_nationkey;
注意:
创建视图时,视图名称不能与已有的表或视图重名。
查询视图
视图创建完成后,可以像查询普通表一样使用
SELECT 语句查询视图。查询订单数量最多的前10名客户:
SELECT c_name, c_mktsegment, order_count, total_spentFROM customer_order_summaryORDER BY order_count DESCLIMIT 10;
在视图上添加过滤条件:
SELECT c_name, order_count, total_spentFROM customer_order_summaryWHERE c_mktsegment = 'BUILDING'AND order_count > 10ORDER BY total_spent DESC;
视图与其他表进行连接:
SELECTrs.region_name,rs.supplier_name,ps.ps_partkey,ps.ps_supplycostFROM regional_suppliers rsINNER JOIN partsupp ps ON rs.s_suppkey = ps.ps_suppkeyWHERE rs.region_name = 'ASIA'ORDER BY ps.ps_supplycostLIMIT 20;
TDSQL Boundless 在查询视图时,会在内部将视图展开为创建时定义的原始 SQL 语句执行。例如查询
customer_order_summary 时,实际执行的是其底层的 SELECT ... FROM customer LEFT JOIN orders ... 语句加上外层的过滤和排序条件。更新视图
当需要修改视图的定义时,可以使用
CREATE OR REPLACE VIEW 语句,无需先删除再重建。为客户订单汇总视图增加平均订单金额字段:
CREATE OR REPLACE VIEW customer_order_summary ASSELECTc.c_custkey,c.c_name,c.c_mktsegment,COUNT(o.o_orderkey) AS order_count,COALESCE(SUM(o.o_totalprice), 0) AS total_spent,COALESCE(AVG(o.o_totalprice), 0) AS avg_order_amountFROM customer cLEFT JOIN orders o ON c.c_custkey = o.o_custkeyGROUP BY c.c_custkey, c.c_name, c.c_mktsegment;
也可以通过先删除再创建的方式更新视图:
DROP VIEW IF EXISTS customer_order_summary;CREATE VIEW customer_order_summary ASSELECT ...;
获取视图相关信息
使用 SHOW CREATE VIEW
查看视图的完整创建语句:
SHOW CREATE VIEW customer_order_summary\\G
查询 INFORMATION_SCHEMA
通过系统表
information_schema.views 查看视图的元数据信息:SELECTTABLE_NAME,VIEW_DEFINITION,CHECK_OPTION,IS_UPDATABLEFROM information_schema.viewsWHERE TABLE_SCHEMA = 'your_database_name'AND TABLE_NAME = 'customer_order_summary'\\G
删除视图
使用
DROP VIEW 语句删除视图。建议使用 IF EXISTS 避免视图不存在时报错。DROP VIEW IF EXISTS customer_order_summary;
一次删除多个视图:
DROP VIEW IF EXISTS customer_order_summary, regional_suppliers;
局限性
在 TDSQL Boundless 中使用视图时,需要注意以下限制:
不支持物化视图 — 仅支持普通视图,不预存结果。
只读视图 — 不支持
UPDATE/INSERT/DELETE/TRUNCATE 写入操作。DDL 限制 — 仅支持
DROP VIEW/TABLE,不支持 ALTER VIEW。