【MYSQL】视图--详解

一.视图定义

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

二.基本使用

创建视图

语法:

sql 复制代码
create view 视图名 as select语句;

在bash中我们看不见myview.frm,但是在mysql5.7中可以看到如下:

1. 为什么看不到 myview.frm 了?

在 MySQL 5.7 及更早版本中,每个视图和表都会以 视图名.frm 的形式单独存放在数据库目录下。但从 MySQL 8.0 开始,所有关于表、列、视图等结构的元数据,都被统一存储在了由 InnoDB 存储引擎管理的"数据字典"表中。

官方文档明确指出,.frm 文件已被移除,其内容现在全部存储在数据字典表里。所以,在 /var/lib/mysql/test_db/ 目录下找不到 myview.frm 是 MySQL 8.0 的预期行为。

2. 在 MySQL 8.0 中如何查看视图信息?

既然文件里看不到了,就需要通过 SQL 命令来查询这个中央数据字典。你之前的 ls 方法不再适用,请改用以下 mysql 命令行客户端里的 SQL 命令:

首先,登录到 MySQL 命令行:

sql 复制代码
mysql -u root -p

然后,执行以下任一 SQL 语句查看视图定义:

  • 方法一:使用 SHOW CREATE VIEW (最常用,信息最清晰)

    这个命令会完整地显示创建 myview 这个视图的 SQL 语句。

    sql 复制代码
    USE test_db;
    SHOW CREATE VIEW myview;
  • 方法二:查询 INFORMATION_SCHEMA 数据库

    INFORMATION_SCHEMA 是 MySQL 提供的一个标准化的元数据视图,你可以像查普通表一样查它。

    cpp 复制代码
    -- 查看视图的定义语句
    SELECT VIEW_DEFINITION 
    FROM INFORMATION_SCHEMA.VIEWS 
    WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'myview';
    
    -- 查看视图的创建选项
    SELECT * 
    FROM INFORMATION_SCHEMA.VIEWS 
    WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'myview'\G

视图好处:

1. 降低查询复杂度,提升开发效率

视图可以将复杂的多表关联查询(如查询某人的部门名称)封装为一张"虚拟表"。开发人员或报表系统查询时,无需重复编写复杂的 JOIN 逻辑,只需 SELECT * FROM user_dept_view 即可,显著简化了代码,减少了出错几率。

2. 提供逻辑数据独立性,屏蔽底层变更

即使底层原始表结构发生变化(例如字段重命名、分表存储),只要视图的定义不变,上层应用程序的查询代码就无需任何修改。这大大降低了因数据库重构导致的应用代码改造成本。

3. 利用查询改写与缓存,提升高频访问性能

虽然视图本身不存数据,但数据库优化器可以对视图进行查询改写。对于高频访问且变化不频繁的聚合结果(如某部门的人数统计),结合物化视图(或数据库内置的查询缓存)可以大幅降低原始表的计算压力,实现"以空间换时间"。

  • 修改了视图,对基表数据有影响
  • 修改了基表,对视图有影响

删除视图

语法:

sql 复制代码
drop view 视图名;

在MySQL5.7下看结构被删除了

查不到myvie了

三.视图规则和限制

  • 与表一样,必须唯一命名(不能出现同名视图或表名)

  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响

  • 视图不能添加索引,也不能有关联的触发器或者默认值

  • 视图可以提高安全性,必须具有足够的访问权限

  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖

  • 视图可以和表一起使用
    补充一些方面:

  • 命名与结构

  1. 必须唯一命名(不能与表或其他视图重名)
  2. 创建数目无限制,但性能需评估
  3. 视图可以与其他表/视图联合查询
  • 索引与性能
  1. 视图不能建索引
  2. 不能有关联的触发器或默认值
  3. 包含聚合/GROUP BY/DISTINCT/UNION/子查询的视图强制使用 TEMPTABLE 算法
  4. 视图嵌套超过3层会显著影响性能
  • 数据修改限制(只读视图) 以下情况视图不可更新:
  1. 包含聚合函数、DISTINCT、GROUP BY、HAVING
  2. 包含 UNION / UNION ALL
  3. FROM 子查询(派生表)
  4. 某些类型的子查询
  • 安全与权限
  1. 视图可用于隐藏敏感字段(安全)
  2. 必须拥有 SELECT 权限才能创建视图
  3. WITH CHECK OPTION 可防止插入不符合视图条件的数据
  • ORDER BY 规则
  1. 视图内的 ORDER BY 可能被外层查询覆盖
  2. 如果视图内有 LIMIT,ORDER BY 不会被覆盖
  • 维护风险
  1. 底层表结构变更可能导致视图失效
  2. 定期检查视图有效性:`INFORMATION_SCHEMA.VIEWS`
  • MySQL 与其他数据库差异

MySQL 不支持物化视图、索引视图、参数化视图、视图触发器

相关推荐
2501_933670796 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
我要见SA姐18 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
xcLeigh9 小时前
聊聊国产化替换:好用数据迁移工具KDMS怎么帮咱们搞定评估难
数据库·sql·数据迁移·kes·kdms
Elastic 中国社区官方博客9 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
我要见SA姐110 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
数据库·ide·vscode·oracle·编辑器
Nturmoils11 小时前
一份 KDMS 评估报告,怎样排出迁移先后顺序
数据库
这个DBA有点耶11 小时前
异构数据集成怎么做?5 种同步方案对比 + 金融级 CDC 实战解析
数据库·oracle·架构
独泪了无痕11 小时前
SQL函数实战:GREATEST与LEAST的技巧
数据库·sql·mysql
麻辣布丁11 小时前
MySQL篇面试题模拟
mysql
码少女12 小时前
Linux--多路转接之select
java·服务器·数据库