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