一. 视图介绍
1.1 视图的含义
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。
通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
1.2 视图的特点
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
1.3 视图的作用
方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;
二. 创建视图
视图中包含了SELECT查询的结果,因此视图的创建基于SELECT语句和已存在的数据表。
2.1 如何创建视图
创建视图就是采用 create view 视图名 as select语句就好。
2.2 在单表上创建视图
1 mysql> create table user(id int,name varchar(30));2 Query OK, 0 rows affected (0.05sec)3
4 mysql> insert into user(id,name) values(1,’zhangsan’),(2,’lisi’),(3,’wangwu’);5 Query OK, 3 rows affected (0.02sec)6 Records: 3 Duplicates: 0 Warnings: 0
7
8 mysql> select *fromuser;9 +——+———-+
10 | id | name |
11 +——+———-+
12 | 1 | zhangsan |
13 | 2 | lisi |
14 | 3 | wangwu |
15 +——+———-+
16 3 rows in set (0.00sec)17
18 mysql> create view view_user as select name fromuser;19 Query OK, 0 rows affected (0.02sec)20
21 mysql> select *fromview_user;22 +———-+
23 | name |
24 +———-+
25 | zhangsan |
26 | lisi |
27 | wangwu |
28 +———-+
29 3 rows in set (0.00sec)30
31 mysql> create view view_user2(view_name) as select name fromuser;32 Query OK, 0 rows affected (0.02sec)33
34 mysql> select *fromview_user2;35 +———–+
36 | view_name |
37 +———–+
38 | zhangsan |
39 | lisi |
40 | wangwu |
41 +———–+
42 3 rows in set (0.00sec)43
44 mysql>
View Code
说明:在创建视图view_user和view_user2的时候,可以指定视图中应该包含的字段名字。如果不指定,就默认时表格中的字段名字。反正属性是一样的,比如都是varchar(30)
2.3 在多个表上创建视图
比如:有一个student表,包含学号和姓名;还有一个表info表,包含学号,班级,成绩;但是最终成绩单上只想保存学号,姓名,成绩这3个字段该怎么办呢,这个时候就可以在多个表上创建一个视图t,让它只包含这三个字段。
1 mysql>create table stu(2 -> id int,3 -> name varchar(30));4 Query OK, 0 rows affected (0.05sec)5
6 mysql> insert into stu(id,name) values(1,’zhangsan’),(2,’lisi’),(3,’wangwu’);7 Query OK, 3 rows affected (0.01sec)8 Records: 3 Duplicates: 0 Warnings: 0
9
10 mysql> select *fromstu;11 +——+———-+
12 | id | name |
13 +——+———-+
14 | 1 | zhangsan |
15 | 2 | lisi |
16 | 3 | wangwu |
17 +——+———-+
18 3 rows in set (0.00 sec)
View Code
1 mysql>create table info(2 -> id int,3 -> classNum int,4 -> grade int);5 Query OK, 0 rows affected (0.04sec)6
7 mysql> insert into info(id,classNum,grade) values(1,1,98),(2,2,89),(3,3,78);8 Query OK, 3 rows affected (0.01sec)9 Records: 3 Duplicates: 0 Warnings: 0
10
11 mysql> select *frominfo;12 +——+———-+——-+
13 | id | classNum | grade |
14 +——+———-+——-+
15 | 1 | 1 | 98 |
16 | 2 | 2 | 89 |
17 | 3 | 3 | 78 |
18 +——+———-+——-+
View Code
创建视图:
1 mysql> create view t as select stu.id,stu.name,info.grade from stu,info where stu.id=info.id;2 Query OK, 0 rows affected (0.02sec)3
4 mysql> select *fromt;5 +——+———-+——-+
6 | id | name | grade |
7 +——+———-+——-+
8 | 1 | zhangsan | 98 |
9 | 2 | lisi | 89 |
10 | 3 | wangwu | 78 |
11 +——+———-+——-+
12 3 rows in set (0.00 sec)
View Code
三. 查看视图
类似表格中的查看语句
3.1 采用DESCRIBE语句查看视图基本信息
DESCRIBE 视图名;
1 mysql>describe t;2 +——-+————-+——+—–+———+——-+
3 | Field | Type | Null | Key | Default | Extra |
4 +——-+————-+——+—–+———+——-+
5 | id | int(11) | YES | | NULL | |
6 | name | varchar(30) | YES | | NULL | |
7 | grade | int(11) | YES | | NULL | |
8 +——-+————-+——+—–+———+——-+
9 3 rows in set (0.00 sec)
View Code
3.2 使用SHOW CREATE VIEW语句查看视图详细信息
SHOW CREATE VIEW 视图名;
四. 修改视图
MySql中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。
4.1 使用CREATE OR REPLACE VIEW语句修改视图
1 mysql> create or replace view t as select * fromstu;2 Query OK, 0 rows affected (0.02sec)3
4 mysql> select *fromt;5 +——+———-+
6 | id | name |
7 +——+———-+
8 | 1 | zhangsan |
9 | 2 | lisi |
10 | 3 | wangwu |
11 +——+———-+
12 3 rows in set (0.00 sec)
View Code
4.2 使用ALTER语句修改视图
1 mysql> alter view t as select name fromuser;2 Query OK, 0 rows affected (0.02sec)3
4 mysql> select *fromt;5 +———-+
6 | name |
7 +———-+
8 | zhangsan |
9 | lisi |
10 | wangwu |
11 +———-+
12 3 rows in set (0.00 sec)
View Code
五. 更新视图
更新视图是指通过视图来插入、更新、删除表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。
5.1 使用update语句更新视图
1 mysql> select *fromstu;2 +——+———-+
3 | id | name |
4 +——+———-+
5 | 1 | zhangsan |
6 | 2 | lisi |
7 | 3 | wangwu |
8 +——+———-+
9 3 rows in set (0.00sec)10
11 mysql> create view t1 as select name from stu where id=1;12 Query OK, 0 rows affected (0.02sec)13
14 mysql> select *fromt1;15 +———-+
16 | name |
17 +———-+
18 | zhangsan |
19 +———-+
20 1 row in set (0.00sec)21
22 mysql> create view t2 as select name from stu where id=2;23 Query OK, 0 rows affected (0.02sec)24
25 mysql> select *fromt2;26 +——+
27 | name |
28 +——+
29 | lisi |
30 +——+
31 1 row in set (0.00sec)32
33 mysql> update t1 set name=’zhangsan2′;34 Query OK, 1 row affected (0.01sec)35 Rows matched: 1 Changed: 1 Warnings: 0
36
37 mysql> select *fromt1;38 +———–+
39 | name |
40 +———–+
41 | zhangsan2 |
42 +———–+
43 1 row in set (0.00sec)44
45 mysql> select *fromstu;46 +——+———–+
47 | id | name |
48 +——+———–+
49 | 1 | zhangsan2 | //发现对视图的修改,更新也会同步到基本表中;反之也是可以的
50 | 2 | lisi |
51 | 3 | wangwu |
52 +——+———–+
53 3 rows in set (0.00sec)54
55 mysql>
View Code
5.2 使用insert语句在基本表中插入一条记录
1 mysql> select *fromt1;2 +———–+
3 | name |
4 +———–+
5 | zhangsan2 |
6 +———–+
7 1 row in set (0.00sec)8
9 mysql> select *fromt2;10 +——+
11 | name |
12 +——+
13 | lisi |
14 +——+
15 1 row in set (0.00sec)16
17 mysql> insert into stu values(1,’add1′),(2,’add2′);18 Query OK, 2 rows affected (0.01sec)19 Records: 2 Duplicates: 0 Warnings: 0
20
21 mysql> select *fromt1;22 +———–+
23 | name |
24 +———–+
25 | zhangsan2 |
26 | add1 |
27 +———–+
28 2 rows in set (0.00sec)29
30 mysql> select *fromt2;31 +——+
32 | name |
33 +——+
34 | lisi |
35 | add2 |
36 +——+
37 2 rows in set (0.00sec)38
39 mysql>
40
41 说明:因为t1视图的查询语句是select name from stu where id=1
42 t2视图的查询语句是select name from stu where id=2
43 因此,当执行一条insert语句后,id=1,2的地方都增加了数据,因此视图中也会增加数据
View Code
5.3 使用delete语句删除视图中的一条记录
1 mysql> select *fromstu;2 +——+———–+
3 | id | name |
4 +——+———–+
5 | 1 | zhangsan2 |
6 | 2 | lisi |
7 | 3 | wangwu |
8 | 1 | add1 |
9 | 2 | add2 |
10 +——+———–+
11 5 rows in set (0.00sec)12
13 mysql> delete from t1 where name=’zhangsan2′;14 Query OK, 1 row affected (0.01sec)15
16 mysql> select *fromstu;17 +——+——–+
18 | id | name |
19 +——+——–+
20 | 2 | lisi |
21 | 3 | wangwu |
22 | 1 | add1 |
23 | 2 | add2 |
24 +——+——–+
25 4 rows in set (0.00 sec)
View Code
Note:当视图中包含如下内容时,视图的更新操作将不能被执行:
视图中不包含基表中被定义为非空的列;
在定义视图的SELECT语句后的字段列表中使用了数学表达式;
在定义视图的SELECT语句后的字段列表中使用聚合函数;
在定义视图的SELECT语句中使用了DISTINCT,UNION, TOP, GOURP BY或HAVING子句
六. 删除视图
直接使用 DROP VIEW 视图名;