当前位置: 首页 > news >正文

MySQL(六) - 视图管理

文章目录

  • 一、视图介绍
    • 1. 视图的本质与特点
    • 2. 视图与表的区别
    • 3. 视图的适用场景
  • 二、视图管理
    • 1. 创建视图
      • 1.1 创建视图语法及解释
      • 1.2 创建视图示例
        • 1.2.1 示例1:创建学生基本信息视图(单表视图)
        • 1.2.2 示例2:创建学生选课详情视图(多表关联视图)
    • 2. 查看视图
      • 2.1 查看视图结构
        • 2.1.1 查看视图结构语法
        • 2.1.2 查看视图结构示例
      • 2.2 查看视图状态
        • 2.2.1 查看视图状态语法
        • 2.2.2 查看视图状态示例
      • 2.3 查看视图创建信息
        • 2.3.1 查看视图创建信息语法
        • 2.3.2 查看视图创建信息示例
    • 3. 修改视图
      • 3.1 修改视图语法及解释
      • 3.2 修改视图示例
        • 3.2.1 示例1:修改视图的算法和列名
        • 3.2.2 示例2:修改视图的SQL语句
    • 4. 删除视图
      • 4.1 删除视图语法
      • 4.2 删除视图示例
    • 5. 视图中的数据操作
      • 5.1 查询数据
      • 5.2 插入数据
      • 5.3 更新数据
      • 5.4 删除数据


一、视图介绍

在MySQL数据库中,视图(View)是一种虚拟存在的表,它并不在数据库中实际存储数据,而是通过查询语句动态关联一个或多个基础表的数据。简单来说,视图可以理解为一条预定义好的SELECT查询语句的别名,当用户访问视图时,数据库会执行这条隐藏的查询语句,并将结果以表的形式返回。

1. 视图的本质与特点

视图的核心本质是“查询的封装”,它具备以下几个显著特点:

  1. 虚拟性:视图没有实际的物理存储,不占用额外的磁盘空间,其数据来源于基础表(也称为基表)的实时查询结果。
  2. 动态性:当基础表的数据发生变化(增、删、改)时,通过视图查询到的数据会随之自动更新,无需手动维护视图数据。
  3. 安全性:视图可以隐藏基础表的结构和敏感字段,只向用户暴露必要的列,降低数据泄露风险。例如,员工表中包含薪资等敏感信息时,可通过视图只展示姓名、部门等非敏感字段。
  4. 简化性:对于复杂的查询(如多表关联、聚合计算等),可以将其封装为视图,用户无需重复编写复杂SQL,只需查询视图即可获取结果,提升操作效率。

2. 视图与表的区别

虽然视图在查询时表现得与表类似(都可以使用SELECT语句查询),但二者存在本质区别:

  • 存储方式:表是物理存在的,数据存储在磁盘上;视图是虚拟的,仅存储查询逻辑,不存储数据。
  • 数据修改:表可以直接通过INSERT、UPDATE、DELETE等语句修改数据;视图的修改则受限于基础表结构和视图定义(部分视图不支持修改操作)。
  • 依赖关系:视图依赖于基础表而存在,若删除基础表,相关视图会失效;表则是独立的存储单元。

3. 视图的适用场景

视图在实际开发中应用广泛,典型场景包括:

  1. 简化复杂查询:将多表关联、子查询、聚合函数等复杂逻辑封装为视图,减少重复编码。
  2. 数据权限控制:通过视图限制用户可访问的字段或行,实现精细化权限管理。
  3. 兼容旧系统:当基础表结构调整时,可通过视图维持旧的查询接口,避免影响依赖该接口的系统。
  4. 临时数据分析:为特定分析场景创建视图,快速获取目标数据集合,无需重复编写查询条件。

通过合理使用视图,能够有效提升数据库操作的便捷性、安全性和可维护性,是MySQL数据库管理中重要的工具之一。


二、视图管理

1. 创建视图

1.1 创建视图语法及解释

在MySQL中,创建视图的基本语法如下:

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
[DEFINER={user|CURRENT_USER}]
VIEW 视图名称 [(列名1, 列名2, ...)]
AS
SELECT 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];

语法参数解释:

  • OR REPLACE:可选参数,若视图已存在则替换原有视图,避免重复创建时的报错

  • 视图名称:自定义的视图标识符,需符合MySQL命名规范

  • (列名1, 列名2, …):可选参数,指定视图的列名,若不指定则默认使用SELECT语句中的列名

  • AS:关键字,用于连接视图名称和查询语句

  • SELECT 查询语句:定义视图数据来源的查询逻辑,可包含单表查询、多表关联、子查询等

  • WITH CHECK OPTION:可选参数,用于限制通过视图修改数据的范围

    • CASCADED(默认):检查所有相关视图的约束条件
    • LOCAL:仅检查当前视图的约束条件
  • ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}:可选参数,指定视图的执行算法,决定MySQL如何处理视图的查询请求:

    • UNDEFINED(默认):由MySQL自动选择算法,通常会优先选择MERGE算法(若适用),若不适用则使用TEMPTABLE算法。
    • MERGE:将视图的查询逻辑与用户对视图的查询语句合并,相当于直接对基础表执行合并后的查询。此算法下视图修改操作(如INSERT、UPDATE)更灵活,但要求视图定义的查询语句不能包含聚合函数、DISTINCT、GROUP BY等复杂逻辑。
    • TEMPTABLE:先将视图查询结果存储在临时表中,再对临时表执行用户的查询。由于依赖临时表,此算法下视图不支持修改操作(INSERT、UPDATE、DELETE),但可兼容包含聚合函数、DISTINCT等的复杂查询。
  • DEFINER={user|CURRENT_USER}:可选参数,指定视图的定义者(创建者),用于控制视图的访问权限:

    • user:显式指定定义者,格式为'用户名'@'主机名'(如'admin'@'localhost')。
    • CURRENT_USER(默认):使用当前创建视图的用户作为定义者。

视图的权限检查会基于定义者(DEFINER)或调用者(INVOKER,需结合SQL SECURITY参数,若未显式指定则默认SQL SECURITY DEFINER)的权限。SQL SECURITY DEFINER表示以定义者的权限执行视图操作,SQL SECURITY INVOKER表示以调用者的权限执行,确保视图操作符合权限控制规则。

1.2 创建视图示例

基于前面创建的学生表(student)、课程表(course)和选课表(student_course),以下是几个实用的视图创建示例:

1.2.1 示例1:创建学生基本信息视图(单表视图)

隐藏敏感字段,只展示学生公开信息:

-- 创建学生基本信息视图
CREATE OR REPLACE VIEW v_student_basic
AS
SELECT student_no AS 学号,student_name AS 姓名,gender AS 性别,major AS 专业,enroll_date AS 入学时间
FROM student;
1.2.2 示例2:创建学生选课详情视图(多表关联视图)

关联三张表,展示学生选课及成绩信息:

CREATE OR REPLACE VIEW v_student_course_detail
AS
SELECT s.student_no AS 学号,s.student_name AS 学生姓名,c.course_no AS 课程编号,c.course_name AS 课程名称,c.teacher_name AS 授课教师,sc.select_time AS 选课时间,sc.score AS 成绩,CASE sc.is_valid WHEN 1 THEN '有效' ELSE '已退课' END AS 选课状态
FROM student s
INNER JOIN student_course sc ON s.student_id = sc.student_id
INNER JOIN course c ON sc.course_id = c.course_id;

2. 查看视图

在MySQL中,管理视图时经常需要查看视图的结构、状态及创建信息,以便了解视图的字段组成、依赖关系和定义逻辑。以下是具体的查看方法:

2.1 查看视图结构

查看视图结构主要是获取视图包含的字段名称、数据类型、是否允许为NULL等信息,类似查看表的结构,帮助用户了解视图的“表结构”特征。

2.1.1 查看视图结构语法

常用语法有两种,与查看表结构的语法一致:

  1. 使用DESCRIBE(或缩写DESC)语句:

    DESCRIBE 视图名称;
    -- 或简写
    DESC 视图名称;
    
  2. 使用SHOW COLUMNS语句:

    SHOW COLUMNS FROM 视图名称;
    
2.1.2 查看视图结构示例

基于前面创建的视图,示例如下:

示例1:使用DESC查看视图结构
查看学生基本信息视图v_student_basic的结构。

DESC v_student_basic;

执行结果会显示视图的字段名、类型、是否为NULL、键类型、默认值等信息,如下图所示。

在这里插入图片描述

示例2:使用SHOW COLUMNS查看视图结构
查看课程平均成绩视图v_student_basic的结构。

SHOW COLUMNS FROM v_student_basic;

执行结果与DESC类似,会列出视图的字段详情:

在这里插入图片描述

2.2 查看视图状态

查看视图状态主要用于获取视图的元数据信息,如所属数据库、创建时间、最后更新时间等,帮助了解视图的生命周期和存储属性(尽管视图本身不存储数据)。

2.2.1 查看视图状态语法

通过查询MySQL系统表information_schema.TABLES实现,语法如下。常用字段包括:TABLE_NAME(视图名)、TABLE_SCHEMA(所属库)、CREATE_TIME(创建时间)、UPDATE_TIME(更新时间)等。

SELECT 字段列表 
FROM information_schema.TABLES 
WHERE TABLE_TYPE = 'VIEW'  -- 筛选视图(表的类型为'BASE TABLE')AND TABLE_SCHEMA = '数据库名称'  -- 指定数据库[AND TABLE_NAME = '视图名称'];  -- 可选,指定视图

SHOW TABLE STATUS LIKE '视图名称';
2.2.2 查看视图状态示例

示例1:查看数据库中所有视图的状态
查看test001数据库中所有视图的状态。

SELECT TABLE_NAME AS 视图名称,TABLE_SCHEMA AS 所属数据库,CREATE_TIME AS 创建时间,UPDATE_TIME AS 最后更新时间
FROM information_schema.TABLES 
WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA = 'test001';

执行结果会列出该数据库中所有视图的基本状态信息,如下图所示。

在这里插入图片描述

示例2:查看指定视图的状态

SELECT TABLE_NAME AS 视图名称,TABLE_SCHEMA AS 所属数据库,CREATE_TIME AS 创建时间,UPDATE_TIME AS 最后更新时间
FROM information_schema.TABLES 
WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA = 'test001' AND TABLE_NAME='v_student_basic';

在这里插入图片描述

2.3 查看视图创建信息

查看视图创建信息是获取视图的完整定义语句(包括CREATE VIEW关键字、查询逻辑、WITH CHECK OPTION等参数),便于复用、备份或修改视图。

2.3.1 查看视图创建信息语法

最直接的方式是使用SHOW CREATE VIEW语句:

SHOW CREATE VIEW '视图名称';

该语句会返回视图的名称、完整创建语句、字符集等信息。

2.3.2 查看视图创建信息示例

示例:查看视图v_student_basic的完整创建语句

SHOW CREATE VIEW v_student_basic;

执行结果中,Create View字段会显示完整的创建语句,如下图所示。
在这里插入图片描述

3. 修改视图

当视图的查询逻辑需要调整(如新增字段、修改筛选条件等)时,可以通过修改视图功能更新视图定义,无需删除后重新创建。

3.1 修改视图语法及解释

MySQL中修改视图的语法与创建视图类似,具体如下:

ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
[DEFINER={user|CURRENT_USER}]
VIEW 视图名称 [(列名1, 列名2, ...)]
AS
SELECT 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];

语法参数解释(与创建视图一致,核心作用是更新视图的定义逻辑):

  • ALGORITHM:指定视图的执行算法(UNDEFINED/MERGE/TEMPTABLE),修改时可调整算法类型。
  • DEFINER:指定视图的定义者,修改时可变更视图的权限关联用户。
  • 视图名称:需修改的目标视图名称(必须已存在)。
  • (列名1, 列名2, …):更新视图的列名映射,若不指定则默认使用SELECT语句中的列名。
  • AS + SELECT 查询语句:核心修改部分,通过新的查询语句更新视图的数据来源逻辑。
  • WITH CHECK OPTION:修改视图的数据修改约束规则(CASCADED/LOCAL)。

修改视图的本质是替换原有视图的定义,不会影响基础表的数据,也不会改变视图与基础表的依赖关系。

3.2 修改视图示例

3.2.1 示例1:修改视图的算法和列名

为学生选课详情视图v_student_course_detail修改算法为TEMPTABLE,并调整列名格式:

ALTER ALGORITHM = TEMPTABLEVIEW v_student_course_detail (学号, 学生姓名, 课程编号, 课程名称, 授课教师, 选课时间, 成绩, 选课状态)
AS
SELECT s.student_no,s.student_name,c.course_no,c.course_name,c.teacher_name,sc.select_time,sc.score,CASE sc.is_valid WHEN 1 THEN '有效' ELSE '已退课' END AS 选课状态
FROM student s
INNER JOIN student_course sc ON s.student_id = sc.student_id
INNER JOIN course c ON sc.course_id = c.course_id;

修改后,视图使用临时表算法(不支持修改操作)。

3.2.2 示例2:修改视图的SQL语句

为学生基本信息视图v_student_basic新增“出生日期”字段。

ALTER VIEW v_student_basic
AS
SELECT student_no AS 学号,student_name AS 姓名,gender AS 性别,major AS 专业,enroll_date AS 入学时间,birth_date AS 出生日期
FROM student;

修改后,查询该视图会包含“出生日期”信息。

4. 删除视图

当视图不再需要时,可以通过删除操作移除视图。删除视图仅会删除视图的定义(即预存的查询逻辑),不会影响基础表的数据,也不会删除基础表本身。

4.1 删除视图语法

MySQL中删除视图的基本语法如下:

DROP VIEW [IF EXISTS] 视图名称 [, 视图名称2, ...] [RESTRICT|CASCADED];

语法参数解释

  • IF EXISTS:可选参数,用于避免删除不存在的视图时出现报错(若视图不存在,带此参数则不报错)。
  • 视图名称 [, 视图名称2, …]:指定要删除的一个或多个视图名称,多个视图用逗号分隔。
  • RESTRICT|CASCADED:可选参数,用于控制删除行为(MySQL中目前对这两个参数的处理一致,均为直接删除指定视图,无特殊限制,与标准SQL中的级联删除逻辑不同)。

4.2 删除视图示例

删除学生选课详情视图v_student_course_detail

DROP VIEW IF EXISTS v_student_course_detail;

5. 视图中的数据操作

视图虽然是虚拟表,但在满足一定条件时,可以通过视图对基础表的数据进行插入、更新和删除操作。这些操作会直接作用于基础表,视图本身不会存储数据,仅作为操作入口。

5.1 查询数据

由于视图本质是虚拟表,其查询方式与普通表完全一致,可直接使用SELECT语句查询视图中的数据,且支持WHEREORDER BYLIMIT等子句。

示例:查询学生基本信息视图中性别为男的数据

SELECT * FROM v_student_basic WHERE 性别 = '男';

在这里插入图片描述

5.2 插入数据

通过视图插入数据时,数据会被插入到视图关联的基础表中,但需满足以下条件:

  • 视图必须包含基础表中所有非空字段(除非基础表字段有默认值);
  • 视图不能包含聚合函数、DISTINCTGROUP BYHAVING等复杂逻辑;
  • 若视图定义了WITH CHECK OPTION,插入的数据必须满足视图的筛选条件;
  • 视图不能是多表关联查询(或多表关联时,修改操作需明确只影响其中一张基础表,且字段归属清晰);
  • 若视图使用ALGORITHM=TEMPTABLE(临时表算法),则不支持任何修改操作(因为数据会先存入临时表,修改临时表不会影响基础表)。

示例:通过v_student_basic视图插入学生数据
向视图插入数据,实际插入到student表。

INSERT INTO v_student_basic (学号, 姓名, 性别, 专业, 入学时间, 出生日期)
VALUES ('2025001', '张三', '男', '软件工程', '2025-09-01', '2007-03-15');

执行后,student表会新增一条记录,通过视图查询或表查询可看到该数据:

SELECT * FROM v_student_basic WHERE 学号 = '2025001';

SELECT * FROM student WHERE student_no = '2025001';

在这里插入图片描述

5.3 更新数据

通过视图更新数据时,会同步更新基础表的数据,需满足的条件与插入数据相同。

示例:通过视图更新学生专业
将学号为2025001的学生专业改为“计算机科学与技术”。

UPDATE v_student_basic SET 专业 = '计算机科学与技术' WHERE 学号 = '2025001';

执行后,student表中对应记录的major字段会被更新。

5.4 删除数据

通过视图删除数据时,会删除基础表中对应的记录,需满足的条件与插入数据相同。

示例:通过视图删除学生数据
通过视图删除学号为2025001的学生记录。

DELETE FROM v_student_basic WHERE 学号 = '2025001';

执行后,student表中对应记录会被删除,视图中也无法再查询到该数据。

http://www.dtcms.com/a/606102.html

相关文章:

  • R语言在线编译器 | 提供快速便捷的编程环境,助力数据分析与学习
  • 网站没有备案是假的吗什么是大型门户网站
  • 做电脑网站与手机上的一样吗网站建设维护需要懂哪些知识
  • UE5 PAK 封包 加载实用方法
  • UE5蓝图实现物体自动沿样条线运动
  • 基于Fovea算法的AI机械手目标检测模型详解
  • 十大景观设计网站上海有名的设计工作室
  • TR3D: Towards Real-Time Indoor 3D Object Detection论文精读
  • Vue 3 函数式编程与Composition API
  • 数据结构——四十一、分块查找(索引顺序查找)(王道408)
  • 苏州网站建设公司有哪几家还可以的洛阳制作网站的公司哪家好
  • 源码篇 虚拟DOM
  • Pig4Cloud微服务分布式ID生成:Snowflake算法深度集成指南
  • 考研资源合集
  • Go语言编译器 | 探讨Go语言编译器的工作原理与优化策略
  • 宁夏一站式网站建设网站做的简单是什么意思
  • 重庆网站建设重庆无锡做企业网站
  • 永嘉县住房和城乡建设局网站哪个程序做下载网站好
  • 刷题leetcode——链表2
  • Telegram 自动打包上传机器人 通过 Telegram 消息触发项目的自动打包和上传。
  • vps网站管理助手下载网页设计及网站建设在线作业
  • Frida 把MessagePack的二进制数据反序列化成JSON,
  • JavaScript 中的 Promise 详解
  • Spring Boot 条件注解:@ConditionalOnProperty 完全解析
  • 做自己的网站多少钱商贸有限公司怎么注销
  • 从近期Kimi-Linear、LongCat-Video和Qwen-Next解读下一代大模型架构升级
  • 记一次 .NET 某理财管理客户端 OOM溢出分析
  • 英文网站如何做seo下载期货行情软件
  • 2022年没封网站直接进入中太建设集团官方网站
  • DeepSeek-OCR实战(06):SpringBoot应用接入