Bootstrap

mysql核心知识之视图的应用

什么是视图?视图的作用是什么?

视图(view):是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。

作用:通过视图,可以展现基表(用来创建视图的表叫做基表base table)的部分数据,说白了视图的数据就是来自于基表

视图的优点是:

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
  
4)不占用空间:视图是逻辑上的表,不占用内存空间

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

创建的基本语法是:

create view <视图名称> as select 语句;
create view <视图名称> (字段) as select 语句;
create or replace view <视图名称>;

create view <视图名称> as select 语句:

mysql> select * from employee;
+-------+--------+--------+------+------------+----------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | deptnu |
+-------+--------+--------+------+------------+----------+--------+
|  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750.00 |     20 |
|  1006 | 猴子   | 经理   | 1009 | 2011-05-01 | 28500.00 |     30 |
|  1007 | 张飞   | 经理   | 1009 | 2011-09-01 | 24500.00 |     10 |
|  1008 | 诸葛亮 | 分析师 | 1004 | 2017-04-19 | 30000.00 |     20 |
|  1013 | 林俊杰 | 分析师 | 1004 | 2011-12-03 | 30000.00 |     20 |
|  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000.00 |     30 |
|  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500.00 |     30 |
|  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500.00 |     30 |
|  1010 | 韩信   | 销售员 | 1006 | 2018-09-08 | 15000.00 |     30 |
|  1012 | 安琪拉 | 文员   | 1006 | 2011-12-03 | 9500.00  |     30 |
|  1014 | 甄姬   | 文员   | 1007 | 2019-01-23 | 7500.00  |     10 |
|  1011 | 妲己   | 文员   | 1008 | 2018-05-23 | 11000.00 |     20 |
|  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 8000.00  |     20 |
|  1009 | 唐僧   | 董事长 | NULL | 2010-11-17 | 50000.00 |     10 |
+-------+--------+--------+------+------------+----------+--------+
14 rows in set (0.03 sec)

mysql> create view employ as select ename,sal from employee;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
| employ         |
| employee       |
| kk             |
| salgrade       |
+----------------+
5 rows in set (0.03 sec)

mysql> select * from employ;
+--------+----------+
| ename  | sal      |
+--------+----------+
| 猪八戒 | 29750.00 |
| 猴子   | 28500.00 |
| 张飞   | 24500.00 |
| 诸葛亮 | 30000.00 |
| 林俊杰 | 30000.00 |
| 牛魔王 | 16000.00 |
| 程咬金 | 12500.00 |
| 后裔   | 12500.00 |
| 韩信   | 15000.00 |
| 安琪拉 | 9500.00  |
| 甄姬   | 7500.00  |
| 妲己   | 11000.00 |
| 小乔   | 8000.00  |
| 唐僧   | 50000.00 |
+--------+----------+
14 rows in set (0.03 sec)

mysql> update employ set sal='40000' where ename='唐僧';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

create or replace view <视图名称>;

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
| employee       |
| kk             |
| salgrade       |
+----------------+
4 rows in set (0.03 sec)

mysql> create or replace view employ as select ename,sal from employee;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from employ;
+--------+----------+
| ename  | sal      |
+--------+----------+
| 猪八戒 | 29750.00 |
| 猴子   | 28500.00 |
| 张飞   | 24500.00 |
| 诸葛亮 | 30000.00 |
| 林俊杰 | 30000.00 |
| 牛魔王 | 16000.00 |
| 程咬金 | 12500.00 |
| 后裔   | 12500.00 |
| 韩信   | 15000.00 |
| 安琪拉 | 9500.00  |
| 甄姬   | 7500.00  |
| 妲己   | 11000.00 |
| 小乔   | 8000.00  |
| 唐僧   | 50000.00 |
+--------+----------+
14 rows in set (0.02 sec)

mysql> create or replace view employ as select ename,sal,job from employee;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from employ;
+--------+----------+--------+
| ename  | sal      | job    |
+--------+----------+--------+
| 猪八戒 | 29750.00 | 经理   |
| 猴子   | 28500.00 | 经理   |
| 张飞   | 24500.00 | 经理   |
| 诸葛亮 | 30000.00 | 分析师 |
| 林俊杰 | 30000.00 | 分析师 |
| 牛魔王 | 16000.00 | 销售员 |
| 程咬金 | 12500.00 | 销售员 |
| 后裔   | 12500.00 | 销售员 |
| 韩信   | 15000.00 | 销售员 |
| 安琪拉 | 9500.00  | 文员   |
| 甄姬   | 7500.00  | 文员   |
| 妲己   | 11000.00 | 文员   |
| 小乔   | 8000.00  | 文员   |
| 唐僧   | 50000.00 | 董事长 |
+--------+----------+--------+
14 rows in set (0.03 sec)

修改视图:

alter view <视图名称> as select 语句;

mysql> select * from employ;
+--------+----------+
| ename  | sal      |
+--------+----------+
| 猪八戒 | 29750.00 |
| 猴子   | 28500.00 |
| 张飞   | 24500.00 |
| 诸葛亮 | 30000.00 |
| 林俊杰 | 30000.00 |
| 牛魔王 | 16000.00 |
| 程咬金 | 12500.00 |
| 后裔   | 12500.00 |
| 韩信   | 15000.00 |
| 安琪拉 | 9500.00  |
| 甄姬   | 7500.00  |
| 妲己   | 11000.00 |
| 小乔   | 8000.00  |
| 唐僧   | 50000.00 |
+--------+----------+
14 rows in set (0.04 sec)

mysql> alter view employ as select ename,sal,job from employee;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from employ;
+--------+----------+--------+
| ename  | sal      | job    |
+--------+----------+--------+
| 猪八戒 | 29750.00 | 经理   |
| 猴子   | 28500.00 | 经理   |
| 张飞   | 24500.00 | 经理   |
| 诸葛亮 | 30000.00 | 分析师 |
| 林俊杰 | 30000.00 | 分析师 |
| 牛魔王 | 16000.00 | 销售员 |
| 程咬金 | 12500.00 | 销售员 |
| 后裔   | 12500.00 | 销售员 |
| 韩信   | 15000.00 | 销售员 |
| 安琪拉 | 9500.00  | 文员   |
| 甄姬   | 7500.00  | 文员   |
| 妲己   | 11000.00 | 文员   |
| 小乔   | 8000.00  | 文员   |
| 唐僧   | 50000.00 | 董事长 |
+--------+----------+--------+
14 rows in set (0.03 sec)

视图删除语法:

drop view <视图名称> ;


mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
| employ         |
| employee       |
| kk             |
| salgrade       |
+----------------+
5 rows in set (0.03 sec)

mysql> drop view employ;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
| employee       |
| kk             |
| salgrade       |
+----------------+
4 rows in set (0.03 sec)

操作数据:

(可以对比创建时的表发现唐僧的工资变为了40000)

mysql> update employ set sal='40000' where ename='唐僧';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from employee;
+-------+--------+--------+------+------------+----------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | deptnu |
+-------+--------+--------+------+------------+----------+--------+
|  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750.00 |     20 |
|  1006 | 猴子   | 经理   | 1009 | 2011-05-01 | 28500.00 |     30 |
|  1007 | 张飞   | 经理   | 1009 | 2011-09-01 | 24500.00 |     10 |
|  1008 | 诸葛亮 | 分析师 | 1004 | 2017-04-19 | 30000.00 |     20 |
|  1013 | 林俊杰 | 分析师 | 1004 | 2011-12-03 | 30000.00 |     20 |
|  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000.00 |     30 |
|  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500.00 |     30 |
|  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500.00 |     30 |
|  1010 | 韩信   | 销售员 | 1006 | 2018-09-08 | 15000.00 |     30 |
|  1012 | 安琪拉 | 文员   | 1006 | 2011-12-03 | 9500.00  |     30 |
|  1014 | 甄姬   | 文员   | 1007 | 2019-01-23 | 7500.00  |     10 |
|  1011 | 妲己   | 文员   | 1008 | 2018-05-23 | 11000.00 |     20 |
|  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 8000.00  |     20 |
|  1009 | 唐僧   | 董事长 | NULL | 2010-11-17 | 40000.00 |     10 |
+-------+--------+--------+------+------------+----------+--------+
14 rows in set (0.04 sec)

注意:当我们修改基表时视图也会发生改变

mysql> select * from employee;
+-------+--------+--------+------+------------+----------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | deptnu |
+-------+--------+--------+------+------------+----------+--------+
|  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750.00 |     20 |
|  1006 | 猴子   | 经理   | 1009 | 2011-05-01 | 28500.00 |     30 |
|  1007 | 张飞   | 经理   | 1009 | 2011-09-01 | 24500.00 |     10 |
|  1008 | 诸葛亮 | 分析师 | 1004 | 2017-04-19 | 30000.00 |     20 |
|  1013 | 林俊杰 | 分析师 | 1004 | 2011-12-03 | 30000.00 |     20 |
|  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000.00 |     30 |
|  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500.00 |     30 |
|  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500.00 |     30 |
|  1010 | 韩信   | 销售员 | 1006 | 2018-09-08 | 15000.00 |     30 |
|  1012 | 安琪拉 | 文员   | 1006 | 2011-12-03 | 9500.00  |     30 |
|  1014 | 甄姬   | 文员   | 1007 | 2019-01-23 | 7500.00  |     10 |
|  1011 | 妲己   | 文员   | 1008 | 2018-05-23 | 11000.00 |     20 |
|  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 8000.00  |     20 |
|  1009 | 唐僧   | 董事长 | NULL | 2010-11-17 | 40000.00 |     10 |
+-------+--------+--------+------+------------+----------+--------+
14 rows in set (0.04 sec)

mysql> update employee set sal='50000' where ename='唐僧';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from employ;
+--------+----------+
| ename  | sal      |
+--------+----------+
| 猪八戒 | 29750.00 |
| 猴子   | 28500.00 |
| 张飞   | 24500.00 |
| 诸葛亮 | 30000.00 |
| 林俊杰 | 30000.00 |
| 牛魔王 | 16000.00 |
| 程咬金 | 12500.00 |
| 后裔   | 12500.00 |
| 韩信   | 15000.00 |
| 安琪拉 | 9500.00  |
| 甄姬   | 7500.00  |
| 妲己   | 11000.00 |
| 小乔   | 8000.00  |
| 唐僧   | 50000.00 |
+--------+----------+
14 rows in set (0.04 sec)

视图的缺点:

1)性能差:sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。

2)修改限制:当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

;