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

视图(View)是数据库中的一种虚拟表,它并不实际存储数据,而是基于一个SELECT查询语句动态生成的结果集。创建视图使用CREATE VIEW语句,其本质是将一条SELECT查询语句保存为一个命名对象,后续可像操作普通表一样查询该视图(支持SELECT,但对INSERT/UPDATE/DELETE有严格限制,取决于视图的定义是否可更新)。

✅ 基本语法:

CREATEVIEWview_nameASSELECTcolumn1,column2,...FROMtable_nameWHEREcondition;

📌 特点:

  • 虚拟性:不占用额外存储空间(除非是物化视图,如 PostgreSQL 的MATERIALIZED VIEW或 Oracle 的物化视图,但标准 SQL 视图默认非物化);
  • 简化复杂查询:封装多表连接、聚合、过滤等逻辑;
  • 安全性:可限制用户仅访问视图中的特定列或行,实现数据访问控制;
  • 逻辑独立性:底层表结构变化时,若视图定义兼容,应用层无需修改。

⚠️ 注意:

  • 视图上执行DML(增删改)通常要求:
    • 单表来源;
    • 不含聚合函数、DISTINCTGROUP BYHAVING、子查询(在SELECT列表或WHERE中的非简单子查询)等;
    • 所有被修改列必须直接映射到基表列,且不可为表达式或常量。

示例:

CREATEVIEWactive_usersASSELECTid,username,emailFROMusersWHEREstatus='active';

之后可直接查询: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 原生不支持(需模拟,如用定时任务+普通表)
✅ PostgreSQL(v9.3+)、Oracle、SQL Server(索引视图)、Snowflake、BigQuery 等支持

🔹适用场景对比

  • 普通视图适用场景
    • 权限控制(如只暴露部分列/行给某用户);
    • 封装复杂查询逻辑,提升 SQL 可读性与复用性;
    • 需要强一致性的业务(如金融交易状态实时展示);
    • 数据量小或查询本身轻量,性能敏感度低。

  • 物化视图适用场景
    报表/BI 分析:频繁查询聚合结果(如日销售额、用户地域分布),且容忍分钟/小时级延迟;
    加速慢查询:对大宽表做多维聚合、连接后结果固定,避免重复计算;
    读多写少 + 网络/计算资源受限环境(如边缘分析、数据仓库分层汇总);
    • 需要为查询创建独立索引(普通视图无法建索引,而物化视图底层是真实表,可建 B-tree、BRIN、GIN 等索引)。

💡 补充说明:

  • PostgreSQL 中物化视图默认不自动刷新,需显式调用REFRESH MATERIALIZED VIEW(支持并发刷新CONCURRENTLY);
  • Oracle 的物化视图支持多种刷新模式(FAST/COMPLETE/FORCE)及自动刷新(基于ON COMMIT或定时器);
  • MySQL 用户可通过「定期INSERT INTO ... SELECT到普通表 + 事件调度器」模拟物化视图行为。