什么是视图?视图的作用是什么?
视图(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)修改限制:当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。