MySQL View

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: view(1)视图是一个虚拟存在的表,视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建。使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。(2)视图在外观上和表很相似,但是它不需要实际上的物理存储,数据还是存储在原来的表里。


view

(1)视图是一个虚拟存在的表,视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建。使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。

(2)视图在外观上和表很相似,但是它不需要实际上的物理存储,数据还是存储在原来的表里。在数据库中,只存放了视图的定义,并没有存放视图的数据,视图的数据是依赖原来表中的数据的,所以原来的表的数据发生了改变,那么显示的视图的数据也会跟着改变,例如向数据表中插入数据,那么在查看视图的时候,会发现视图中也被插入了同样的数据。视图实际上是由预定义的查询形式的表所组成的。

(3)在数据库中,视图的使用方式与表的使用方式一致,我们可以像操作表一样去操作视图,或者去获取数据。一般来说,我们只是利用视图来查询数据,不会通过视图来操作数据。

(4)基于视图可以创建视图

(5)视图增加了数据的安全性和逻辑独立性,数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。视图可以只展现数据表的一部分数据,对于我们不希望让用户看到全部数据,只希望用户看到部分数据的时候,可以选择使用视图。


视图的类型

mysql的视图有三种类型:MERGE、TEMPTABLE、UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

(1)MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

(2)TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

(3)UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

语法:

CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例1:

CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  `c2` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

root@localhost [testdb]>create view v1 as select * from t1;

root@localhost [testdb]>show create view v1\G
*************************** 1. row ***************************
                View: v1
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`c1` AS `c1`,`t1`.`c2` AS `c2` from `t1`
character_set_client: utf8
collation_connection: utf8_general_ci
root@localhost [testdb]>create algorithm=merge view v2 as select * from t1;
root@localhost [testdb]>show create view v2\G
*************************** 1. row ***************************
                View: v2
         Create View: CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t1`.`c1` AS `c1`,`t1`.`c2` AS `c2` from `t1`
character_set_client: utf8
collation_connection: utf8_general_ci


#可以看到视图没有真实的数据文件
[root@Darren2 testdb]# ls    
db.opt   t1.frm  t1.ibd  v1.frm  v2.frm
[root@Darren2 testdb]# cat v1.frm
TYPE=VIEW
query=select `testdb`.`t1`.`c1` AS `c1`,`testdb`.`t1`.`c2` AS `c2` from `testdb`.`t1`
md5=bc42610c419d2ba99157095ecfc2bd85
updatable=1
algorithm=0
definer_user=root
definer_host=localhost
suid=2
with_check_option=0
timestamp=2017-04-08 13:21:05
create-version=1
source=select * from t1
client_cs_name=utf8
connection_cl_name=utf8_general_ci
view_body_utf8=select `testdb`.`t1`.`c1` AS `c1`,`testdb`.`t1`.`c2` AS `c2` from `testdb`.`t1`


[root@Darren2 testdb]# cat v2.frm 
TYPE=VIEW
query=select `testdb`.`t1`.`c1` AS `c1`,`testdb`.`t1`.`c2` AS `c2` from `testdb`.`t1`
md5=bc42610c419d2ba99157095ecfc2bd85
updatable=1
algorithm=2
definer_user=root
definer_host=localhost
suid=2
with_check_option=0
timestamp=2017-04-08 13:21:05
create-version=1
source=select * from t1
client_cs_name=utf8
connection_cl_name=utf8_general_ci
view_body_utf8=select `testdb`.`t1`.`c1` AS `c1`,`testdb`.`t1`.`c2` AS `c2` from `testdb`.`t1`

例2:修改表,视图中数据也会修改:
root@localhost [testdb]>insert into t1 values(2,'bbb');
Query OK, 1 row affected (0.00 sec)
root@localhost [testdb]>select * from v1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
+------+------+

root@localhost [testdb]>select * from v2;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
+------+------+


例3:更新视图,源表数据也会更新:
root@localhost [testdb]>delete from v1 where c1=2;
root@localhost [testdb]>select * from v1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
+------+------+

root@localhost [testdb]>select * from t1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
+------+------+


例4:在视图上建立视图:
root@localhost [testdb]>select v1.c1,v2.c2 from v1 join v2 on v1.c1=v2.c1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
+------+------+
root@localhost [testdb]>create view v12 as select v1.c1,v2.c2 from v1 join v2 on v1.c1=v2.c1;

root@localhost [testdb]>select * from v12;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
+------+------+


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
SQL 算法 安全
心得经验总结:深入解析MySQL视图VIEW
心得经验总结:深入解析MySQL视图VIEW
13 0
|
2月前
|
算法 关系型数据库 MySQL
mysql view 更新问题
mysql view 更新问题
18 0
|
2月前
|
安全 关系型数据库 MySQL
⑩④【MySQL】什么是视图?怎么用?视图的检查选项? 视图的作用?[VIEW]
⑩④【MySQL】什么是视图?怎么用?视图的检查选项? 视图的作用?[VIEW]
71 0
|
12月前
|
SQL 存储 关系型数据库
【MySQL】View 视图用法及作用
1. 视图概述 1.1 为什么使用视图? 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的价格,则不会提供给他。再比如,人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他人的查询视图中则不提供这个字段。
|
SQL 关系型数据库 MySQL
MySQL数据库(26):视图 view
MySQL数据库(26):视图 view
|
存储 关系型数据库 MySQL
MySQL · 源码分析 · InnoDB的read view,回滚段和purge过程简介
笔者最近开始学习InnoDB的内部机制,参照之前的几篇文章整理出InnoDB多版本部分相关的一些实现原理。 InnoDB undo log 漫游 性能优化·5.7 Innodb事务系统 InnoDB 事务系统 [MySQL 5.6] Innodb 新特性之 multi purge thread innodb purge操作 对于undo日志,第1篇文章写得非常清楚,图文并茂。
6276 0
|
SQL MySQL 关系型数据库
sql:Mysql create view,function,procedure
use test; create database Liber; use Liber; #顯示數据庫 20150210 Geovin Du 涂聚文 SHOW DATABASES; drop table BookKindList; #书目录 create table BookKindList ( BookKindID INT NOT NULL AUTO_I
1187 0