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 | +------+------+