【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 不支持物化视图、索引视图、参数化视图、视图触发器

相关推荐
我是一颗柠檬1 小时前
【Redis】主从复制Day9
java·数据库·redis·后端
Wenzar_1 小时前
GeoHash+Redis Streams实时围栏系统实战
java·数据库·redis·junit
侯盛鑫1 小时前
理解 RocksDB IngestExternalFile
数据库·后端
ECT-OS-JiuHuaShan1 小时前
辩证函数,渡劫代谢:时势造英雄,英雄发神经
数据库·人工智能·机器学习
Mr.朱鹏1 小时前
基于 postgres_fdw 的跨库查询方案
java·数据库·spring boot·sql·spring·postgresql
Leo.yuan1 小时前
MySQL到Hive数据同步怎么选工具?FineDataLink全链路方案实测
数据库·hive·mysql
Database_Cool_1 小时前
数据仓库物化视图是什么?阿里云 AnalyticDB MySQL 实时物化视图最佳实践
数据库·数据仓库·mysql
周杰伦fans2 小时前
AutoCAD .NET 二次开发:深入理解 ObjectId = 0 与 ObjectId.Null
数据库·oracle·.net
Leon-Ning Liu2 小时前
【真实经验分享】Oracle 索引并行度引发的进程风暴分析与处理
数据库·oracle