MySQL视图

在MySQL中,视图是一张虚拟表,但是它本身并不存储任何数据。当使用 SQL语句访问视图时,它每次返回的数据是从其他表中临时生成的。在大多数情况下,MySQL中视图和普通表是被同等对待的,不过,视图和表还是有差别,比如视图不能创建触发器,也不能建立索引等。

一、创建视图

CREATE [OR REPLACE] [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE ] VIEW v_name AS 查询语句 [WITH CHECK OPTION] ;

这里的查询语句可以是任意的,因此,视图又分为单表视图(即数据来自于一个表)和多表视图(即数据来自多个表)。

视图一旦被创建,就会生成一个结构文件 .frm。

创建视图的两种算法

视图的实现可以使用两种算法,第一种是 merge算法,第二种是 temptable算法。

1.merge(合并算法)

当用户发起对视图的查询时,服务器将视图 SQL与外部查询 SQL 合并,然后执行并返回结果给客户端。这种算法实现的视图查询效率较高,但是视图SQL中如果包含 GROUP BY、DISTINCT、任何聚合函数、UNION、子查询等时,也就是说如果不能在原表记录视图记录中建立一一映射的场景中,MySQL都会强制使用临时表算法来实现视图。

2.temptable(临时表算法)

当用户发起对视图的查询时,都将执行视图的 SQL语句来形成一个临时表,再用用户的SQL去临时表中查询相关数据。

执行:
CREATE VIEW V1 AS (SELECT * FROM TABLE1 ORDER BY 字段名1);
SELECT * FROM V1 WHERE 条件 ORDER BY 字段名2;

相当于执行:
SELECT * FROM ( SELECT * FROM TABLE1 ORDER BY 字段名1 ) AS TEMP WHERE 条件 ORDER BY 字段名2;

默认情况下,MySQL 会在这两种算法中选择一个。

二、查

从视图中获取数据时就把它当作一个普通的表就可以了,因此无论是普通查询还是复杂查询,视图都可以胜任。

如果想查看视图结构,SHOW TABLES [LIKE] ‘xxx’、DESC tbl_name、SHOW CREATE TABLE tbl_name、SHOW CREATE VIEW v_name 都是可以的。

三、增删改

MySQL中可以通过视图来影响视图的基表,包括更新、删除、增加数据。

下列情况下,对视图数据的增删改将失败:

1、新增数据时,由于视图中没有的字段在基表中将为NULL,因此,若该字段为 NOT NULL并且没有设置默认值,对视图的新增就会失败。
2、如果视图SQL中包含了 GROUP BY、UNION、聚合函数等,对视图的增删改将失败。
3、如果视图SQL为关联语句,那么对视图的增改所涉及到的列必须来自于同一个表中,否则失败。若来自于一张表,对视图的操作也只会影响到这一张表。注意,不能对关联视图数据进行删除。
4、创建视图时,如果加了 WITH CHECK OPTION ,那么对于视图的增改,必须使新得到的视图仍然满足创建视图时的 WHERE条件。否则操作将失败。

对于视图的管理
删除视图:
DROP VIEW [IF EXISTS] v_name;
修改视图结构:
ALTER VIEW v_name [(字段名1,字段名2,…)] AS (查询语句)

四、使用视图的好处

使用视图可以简化开发,将一些复杂的SQL语句保存为视图,之后的操作都可以对视图进行。并且,视图可以实现基于列的权限控制,对外选择性地提供数据,而不用去真正地在系统中创建列权限。

### MySQL 视图的创建与使用 #### 创建视图MySQL 中,可以通过 `CREATE VIEW` 语句来定义一个新的视图视图本质上是一个虚拟表,其内容由查询动态生成[^1]。 ```sql CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition; ``` 例如,在名为 `student` 的表上创建一个简单的视图: ```sql CREATE VIEW student_view AS SELECT * FROM student; ``` 如果需要更复杂的逻辑,可以指定多个表之间的连接条件以及筛选字段。比如,创建一个包含学生姓名 (`sname`)、课程名称 (`cname`) 和成绩 (`grade`) 的视图: ```sql CREATE VIEW student_view (sname, cname, grade) AS SELECT s.sname, c.cname, sc.grade FROM student s JOIN course c ON s.sno = sc.sno JOIN score sc ON c.cno = sc.cno; ``` --- #### 查询视图数据 一旦视图被创建成功,就可以像操作普通表一样对其进行查询。以下是通过视图获取特定学生成绩的例子: ```sql SELECT * FROM student_view WHERE sname = '张三'; ``` 此查询会返回所有属于 “张三” 学生的相关记录及其关联的成绩信息[^2]。 --- #### 删除视图 若不再需要某个视图,则可通过以下命令将其删除: ```sql DROP VIEW IF EXISTS student_view; ``` 注意这里的 `IF EXISTS` 是为了避免因试图移除不存在的对象而导致错误发生。 --- #### 修改视图结构 当原有视图无法满足新的业务需求时,可利用 `ALTER VIEW` 来调整它的定义而不必先删掉它再重建新版本: 假设我们希望更改之前建立的那个复杂视图使其只显示三个核心要素——即学生的全名(`sname`)、所学科目称呼(`cname`)还有分数等级(`grade`)——那么执行如下SQL脚本即可完成更新动作: ```sql ALTER VIEW student_view (sname, cname, grade) AS SELECT s.sname, c.cname, sc.grade FROM student s JOIN course c USING(sno) JOIN score sc USING(cno); ``` 这里采用了稍微不同的写法(`USING()`),简化了原表达式的冗长部分同时保持功能不变. --- #### 更新视图中的基础表格数据 值得注意的是,虽然可以直接向某些类型的视图插入或者修改数据,但这取决于底层实际物理存储的设计模式;并不是所有的视图都支持这样的操作。对于那些允许DML(Data Manipulation Language)活动的视图来说,任何针对它们所做的变更最终都会反映回原始的数据源上去。 --- ### 总结 以上介绍了如何基于MySQL数据库管理系统构建并管理基本到高级别的视图对象。这些技术能够帮助开发者封装复杂的查询逻辑从而提高应用程序开发效率的同时也增强了系统的安全性和灵活性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值