一. 视图介绍

1.1 视图的含义

视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。

通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

1.2 视图的特点

视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

1.3 视图的作用

方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;

二. 创建视图

视图中包含了SELECT查询的结果,因此视图的创建基于SELECT语句和已存在的数据表。

2.1 如何创建视图

创建视图就是采用  create view 视图名 as  select语句就好。

2.2 在单表上创建视图

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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,让它只包含这三个字段。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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

创建视图:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 视图名;

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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语句修改视图

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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语句修改视图

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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语句更新视图

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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语句在基本表中插入一条记录

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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语句删除视图中的一条记录

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 视图名;


版权声明:本文为weixin_33535402原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_33535402/article/details/113301520