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通常更有效,而且如果使用了临时表,视图是不可更新的。

1
2
3
4
5
6
7
8
9
10
语法:
 
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
例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  |
+ ------+------+