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