标签:
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因,
视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT
*,而你看到的将是你在视图定义里给出的那些数据列。
1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。
2.查询性能提高。
3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的。
4.复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。
在创建视图前应先看看是否有权限:
SELECT SELECT_priv,create_view_priv from mysql.user WHERE user=‘root‘
在员工表上创建视图:
CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE,DEPARTMENT) AS SELECT ID, NAME, SEX, AGE,DEPARTMENT FROM t_employee;
查询结果:
SELECT * FROM V_VIEW
CREATE VIEW V_VIEW2(ID, NAME, SEX, AGE,DEPARTMENT,POS,EXPERENCE) AS SELECT a.ID, a.NAME, a.SEX, a.AGE,a.DEPARTMENT,b.POS,b.EXPERENCE FROM t_employee a,t_employee_detail b WHERE a.ID=b.ID;
查询结果:
SELECT * FROM V_VIEW2
ALTER VIEW V_VIEW1(ID, NAME) AS SELECT ID, NAME FROM t_employee;
结果:
在MySQL中,更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据,所以通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。
之前的视图V_VIEW2数据:
两个基础表各添加1条数据
INSERT INTO t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,‘我是测试的‘,‘男‘,84,‘销售部‘,‘5000‘,‘山东‘,‘否‘,‘橄榄球‘); INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(8,‘销售员骨灰‘,‘工作五十年‘);
结果视图就自动添加了:
UPDATE V_VIEW2 SET POS=‘高级工程师‘ WHERE NAME=‘天天‘
视图结果发生变化:
基础表数据也发生变化:
select a.NAME,b.* from t_employee a INNER JOIN t_employee_detail b ON a.ID=b.ID where name=‘天天‘
结果展示:
DROP VIEW IF EXISTS 视图名
标签:
原文地址:http://www.cnblogs.com/chushiyaoyue/p/5943336.html