视图: view, 是一种不存在的虚拟表: 类似表但是不是表

  • 类似表: 视图有表结构
  • 不是表: 没有数据, 视图的数据来源都是基表

视图根据基表的数量分为两种

单表视图: 基表只有一个

mysql视图结果判断 mysql查看视图的结构_数据库

多表视图: 基表至少两个以上

mysql视图结果判断 mysql查看视图的结构_数据库_02

执行了视图的创建语句之后: 到底发生了什么?

1、会在对应的数据库的表空间中产生一个视图(表)
2、会在数据库对应存储文件夹下产生一个结构文件

mysql视图结果判断 mysql查看视图的结构_字段_03

一、查看视图

视图是虚拟表: 有类似的表结构: 凡是表的查看结构所能用的都可以用在视图上面

像表一样查看: show tables;

mysql视图结果判断 mysql查看视图的结构_字段_04

查看视图结构: desc 视图名字;

mysql视图结果判断 mysql查看视图的结构_数据库_05

查看创建语句

mysql视图结果判断 mysql查看视图的结构_mysql视图结果判断_06

还可以使用view关键字

mysql视图结果判断 mysql查看视图的结构_字段_07

二、修改视图

视图的修改与创建类似: 视图结构是从其他表获取过来: 修改的是视图的获取方式.
alter view 视图名 as 新的select语句;

mysql视图结果判断 mysql查看视图的结构_字段_08

三、删除视图

drop view 视图名字;

mysql视图结果判断 mysql查看视图的结构_mysql视图结果判断_09

删除视图发生了什么?

1、数据库没有视图结构
2、数据库文件夹下也不存在对应的视图结构文件

mysql视图结果判断 mysql查看视图的结构_字段_10

四、使用视图

视图的使用: 与表一样的使用(主要用于查询数据)

mysql视图结果判断 mysql查看视图的结构_数据_11

视图自身没有数据: 所有的数据来源都是基于原视图内部的查询语句.

五、视图数据操作

通过视图进行数据的写操作(增删改)

多表视图(基表来源两个以上)不能插入数据, 也不能删除数据: 但是可以修改数据

插入数据

mysql视图结果判断 mysql查看视图的结构_mysql视图结果判断_12

删除数据

mysql视图结果判断 mysql查看视图的结构_数据_13

修改数据: 本身就是对基表进行操作

mysql视图结果判断 mysql查看视图的结构_数据库_14

单表视图操作: 可以进行增删改, 但是要实现新增: 前提是视图必须包含基表的所有不能为空的字段

mysql视图结果判断 mysql查看视图的结构_数据库_15

插入数据: 视图包含所有基表不为空的字段

mysql视图结果判断 mysql查看视图的结构_mysql视图结果判断_16

插入数据: 视图不包含全部的基表不为空的字段

mysql视图结果判断 mysql查看视图的结构_数据库_17

几乎不可能通过视图对表进行数据新增操作

视图更新限制: with check option
当视图原本可以查看到的数据,在经过视图修改的时候,如果修改之后,视图不能查出来: 更新失败

mysql视图结果判断 mysql查看视图的结构_mysql视图结果判断_18

视图修改: 效果验证

mysql视图结果判断 mysql查看视图的结构_字段_19

六、视图算法

理论上: 每一个视图都有算法

视图算法有三种:

  • undefined: 未定义的,默认的: 但是该算法不是真正算法: 真正的执行算法只有temptable和merge: undefined是指交给系统自动选择(系统优先选择merge: 效率高)
  • temptable: 临时表,表示视图对应的select语句单独执行(先)
  • merge: 合并算法: 表示视图的对应的select语句不是单独执行, 而是与外部的select语句先进行合并, 后进行执行.

mysql视图结果判断 mysql查看视图的结构_数据_20

视图: create view v1 as select语句;
查询视图: select * from v1; -- select * from (select 语句) 别名;

需求: 求出每个班年龄最大的一个学生.

mysql视图结果判断 mysql查看视图的结构_数据_21

大部分的时候都会使用视图的默认算法: 但是如果涉及到视图与外部的select语句中有些五子句的关系顺序的时候: 一般使用temptable

七、视图意义

1、视图可以将复杂的SQL查询语句进行了封装: 简化了SQL语句: 从而提升了带宽的使用效率和网络间的传输效率

2、视图的存在: 主要是为了对外提供数据支持(外部系统)

  • 隐藏基表字段(隐私)
  • 保证了数据库的数据安全(保护数据库内部的数据结构)
  • 可以灵活的控制对外的数据: 保证针对每个接口都有一个单独的数据支持: 增强了用户友好性.

3、视图利于权限控制: 有助于数据库对权限进行管理.