视图(View)是数据库中的一种虚拟表,它并不实际存储数据,而是基于一个 `SELECT` 查询语句动态生成的结果集

发布时间:2026/7/9 0:40:51
视图(View)是数据库中的一种虚拟表,它并不实际存储数据,而是基于一个 `SELECT` 查询语句动态生成的结果集 视图View是数据库中的一种虚拟表它并不实际存储数据而是基于一个SELECT查询语句动态生成的结果集。创建视图使用CREATE VIEW语句其本质是将一条SELECT查询语句保存为一个命名对象后续可像操作普通表一样查询该视图支持SELECT但对INSERT/UPDATE/DELETE有严格限制取决于视图的定义是否可更新。✅ 基本语法CREATEVIEWview_nameASSELECTcolumn1,column2,...FROMtable_nameWHEREcondition; 特点虚拟性不占用额外存储空间除非是物化视图如 PostgreSQL 的MATERIALIZED VIEW或 Oracle 的物化视图但标准 SQL 视图默认非物化简化复杂查询封装多表连接、聚合、过滤等逻辑安全性可限制用户仅访问视图中的特定列或行实现数据访问控制逻辑独立性底层表结构变化时若视图定义兼容应用层无需修改。⚠️ 注意视图上执行DML增删改通常要求• 单表来源• 不含聚合函数、DISTINCT、GROUP BY、HAVING、子查询在SELECT列表或WHERE中的非简单子查询等• 所有被修改列必须直接映射到基表列且不可为表达式或常量。示例CREATEVIEWactive_usersASSELECTid,username,emailFROMusersWHEREstatusactive;之后可直接查询SELECT * FROM active_users;视图View和物化视图Materialized View虽然都提供“虚拟表”式的逻辑抽象但核心区别在于数据是否物理存储与是否自动刷新维度普通视图View物化视图Materialized View存储方式❌ 不存储数据仅保存SELECT查询定义元数据✅物理存储查询结果一张实际的数据表数据实时性✅ 实时每次查询都执行底层 SQL返回最新数据⚠️ 延迟数据是快照需手动或定时刷新如REFRESH MATERIALIZED VIEW查询性能可能较慢尤其涉及多表连接、聚合、大数据量时每次重算✅ 通常更快直接查预计算结果支持索引、分区等优化更新能力大部分数据库中不可直接 DML除非简单单表可更新视图一般只读PostgreSQL 默认不可写Oracle 可配置可更新但需满足严格条件存储开销极低仅 SQL 文本较高占用磁盘空间且需维护冗余数据标准支持✅ 所有主流 SQL 数据库MySQL、PostgreSQL、SQL Server、Oracle原生支持物化视图支持❌ MySQL 原生不支持需模拟如用定时任务普通表✅ PostgreSQLv9.3、Oracle、SQL Server索引视图、Snowflake、BigQuery 等支持适用场景对比✅普通视图适用场景• 权限控制如只暴露部分列/行给某用户• 封装复杂查询逻辑提升 SQL 可读性与复用性• 需要强一致性的业务如金融交易状态实时展示• 数据量小或查询本身轻量性能敏感度低。✅物化视图适用场景•报表/BI 分析频繁查询聚合结果如日销售额、用户地域分布且容忍分钟/小时级延迟•加速慢查询对大宽表做多维聚合、连接后结果固定避免重复计算•读多写少 网络/计算资源受限环境如边缘分析、数据仓库分层汇总• 需要为查询创建独立索引普通视图无法建索引而物化视图底层是真实表可建 B-tree、BRIN、GIN 等索引。 补充说明PostgreSQL 中物化视图默认不自动刷新需显式调用REFRESH MATERIALIZED VIEW支持并发刷新CONCURRENTLYOracle 的物化视图支持多种刷新模式FAST/COMPLETE/FORCE及自动刷新基于ON COMMIT或定时器MySQL 用户可通过「定期INSERT INTO ... SELECT到普通表 事件调度器」模拟物化视图行为。