【MySQL】视图特性

目录

MySQL视图特性

基本使用

准备测试表

创建视图

修改视图影响基表

修改基表影响视图

删除视图

视图规则和限制


MySQL视图特性

视图的概念

  • 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。
  • 视图中的数据并不会单独存储在数据库中,其数据来自定义视图时查询所引用的表(基表),在每次引用视图时动态生成。
  • 由于视图和基表用的本质是同一份数据,因此对视图的修改会影响到基表,对基表的修改也会影响到视图。

基本使用

准备测试表

准备测试表

下面用员工表和部门表作为测试表,员工表中的ename代表的是员工的姓名,deptno代表的是员工所在部门的部门号。如下:

部门表中的dname代表的是部门名,deptno代表的是部门的部门号。如下:

创建视图

创建视图

创建视图的SQL如下:

sql 复制代码
CREATE VIEW view_name AS SELECT ...;

当我们要查询每个员工及其对应的部门名称时,需要使用员工表和部门表进行多表查询,并筛选出员工的部门号等于部门的部门号的记录。如下:

如果该查询结果会被频繁用到,那我们就可以给上述查询结果创建视图,创建完毕后通过show命令就能看到这个视图。如下:

并且在数据库对应的目录下,会增加一个对应的xxx.frm文件,但并没有与之对应的xxx.ibd文件,这也证明了视图和基表使用的是同一份数据。如下:

创建视图后就可以直接通过查询视图,来查看每个员工及其对应的部门名称了。如下:

修改视图影响基表

修改视图影响基表

通过查询员工表,可以看到员工CLARK所在部门的部门号为10。如下:

进一步查询部门表,可以看到10号部门的部门名称为ACCOUNTING。如下:

在视图中将员工CLARK所在部门的部门名改为HR后,会看到其他一些员工所在部门的部门名也变为HR了。如下:

根本原因就是因为视图和基表使用的是同一份数据,将视图中CLARK所在部门的部门名改为HR后,部门表中10号部门的部门名也就变成HR了。如下:

而位于10号部门的员工同时还有KING和MILLER,因此修改后再次查询视图时,这两个员工对应的部门名也会变为HR。如下:

修改基表影响视图

修改基表影响视图

通过查询员工表,可以看到员工JAMES所在部门的部门号为30。如下:

30号部门的部门名为SALES,因此查询视图时可以看到JAMES所在的部门名为SALES。如下:

现在将员工表中,员工JAMES对应的部门号改为20。如下:

修改后再查询视图,就会发现JAMES所在部门的部门名,变成了20号部门的部门名RESEARCH。如下:

删除视图

删除视图

删除视图的SQL如下:

sql 复制代码
DROP VIEW view_name;

比如将刚才创建的视图删除后,在数据库中就看不到这个视图了。如下:

并且该视图在数据库目录下对应的xxx.frm文件也会被删除。如下:

视图规则和限制

视图规则和限制

  • 与普通表一样,视图的命名也必须是唯一的,不能出现同名视图或表名。
  • 创建视图的数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
  • 视图不能添加索引,也不能有关联的触发器或者默认值。
  • 视图可以提高安全性,在访问视图时必须具有足够的访问权限。
  • 创建视图时可以使用order by子句,但如果从该视图检索数据时也含有order by子句,那么该视图中的order by将被覆盖。
  • 视图可以和普通表一起使用,比如进行多表查询,内外连接等。
相关推荐
TDengine (老段)3 分钟前
TDengine 快速体验(Docker 镜像方式)
大数据·数据库·物联网·docker·时序数据库·tdengine·涛思数据
笨笨马甲18 分钟前
附加模块--Qt SQL模块功能及架构解析
数据库·sql·qt
独爱竹子的功夫熊猫24 分钟前
数据库技巧:INSERT IGNORE的高效插入策略
数据库·后端·mysql
时序数据说41 分钟前
时序数据库IoTDB数据模型建模实例详解
大数据·数据库·开源·时序数据库·iotdb
水水沝淼㵘1 小时前
嵌入式开发学习日志(数据库II && 网页制作)Day38
服务器·c语言·网络·数据结构·数据库·学习
时序数据说1 小时前
时序数据库IoTDB结合SeaTunnel实现高效数据同步
大数据·数据库·开源·时序数据库·iotdb
云闲不收2 小时前
mysql如何快速生成测试大数据库
数据库·mysql·oracle
Cyrus_柯2 小时前
网络编程(数据库:SQLite)
linux·c语言·数据库·sqlite
2501_915374352 小时前
如何彻底删除Neo4j中的所有数据:完整指南
数据库·oracle·neo4j
YUJIANYUE2 小时前
PHP7+MySQL5.6 雪里开简易预约制访客管理系统V1.0
mysql·php