/* 视图 视图view是一种虚拟存在的表,对于使用视图的用户涞水基本是透明的。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的 视图相当于普通表的优势: 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集 安全:使用视图的用户只能访问到他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响。源表修改列名,则可以通过修改视图来解决,不会对访问者造成影响 */ /* 视图操作: 创建视图 修改视图 删除视图 查看视图定义 */ /* 创建视图的语法: create [or replace] [algorithm={undefined|merge|temptable}] view view_name[(column_list)] as select_statement [[with|cascaded] check option] 修改视图的语法: alter [algorithm={undefined|merge|temptable}] view view_name[(column_list)] as select_statement [[with|cascaded] check option] mysql的视图定义有一些限制,例如:在From关键字后面不能包含子查询,这和其他的数据库是不同的。如果视图是从其他数据库上迁移过来的,那么可能需要因此做一些改动,可以先将子查询的内容先定义成一个视图,然后对该视图再创建视图就可以实现类似的功能了。 */ /* 引入视图: 什么是视图?为什么要使用视图? 有些时候,我们需要只针对一些列操作等,就要用到视图。 视图 view view又被称为虚拟表,view是sql的查询结果,可以理解为物理表的一部分影子 使用视图的好处: 1、简化复杂的查询 2、权限控制到列 视图能不能更新,删除,添加? 首先,针对原始表的操作一定会影响到视图的 更改视图的数据是否会影响到表呢?或者说能不能更改视图中数据呢? 总结出来的是:视图中数据的更改会影响到物理表。但是有些数据的更改无法进行。视图是物理表的特殊的映射构成。 当修改视图影响到的物理表的数据是可见的,客观上一一对应的,就可以更改,如果视图中更改的是某些列的平均值这样不可控的指定更改就会语句执行失败 视图再内存中是怎么存储的呢? 视图再内存中存储的是视图的创建的查询语句 使用视图的过程? 视图的使用过程分为两种情况: 1、如果视图中的代码较少,sql的做法是将视图中的sql语句和操作视图的语句连接成一条语句直接操作物理表,这种操作视图的算法叫做 merge 2、如果视图中的代码较多,sql的做法是先执行视图中的查询语句生成一张临时表,然后将对视图的操作转化成对临时表的操作,这种操作视图的算法叫做temptable 视图实际操作的算法可以自己制定,默认情况下也就是不指定sql就是按照上面的两种方式自动选择操作。指定只需要在view关键字前面加上algorithm={merge|temptable}指定算法 */ select * from emp; --如果我只需要查询emp的ename和hiredate两个选项 select ename,hiredate from emp; --也可以创建一个视图 create view emp_n_h as select ename,hiredate from emp; --然后直接查询视图就好了 select * from emp_n_h; select ename,avg(sal) from emp group by ename order by avg(sal) limit 3;--这样代码显得有点多,可以使用视图优化下 create view emp_n_avgsal as select ename,avg(sal) as avg_sal from emp group by ename; drop view emp_n_avgsal; select * from emp_n_avgsal order by avg_sal limit 3; --查询视图是查询不到物理表中的其他数据的 update emp set ename='guo' where deptno=1; select * from emp; select * from emp_n_h; -- update emp_n_h set ename='guozhen' where ename='guo';--可以发现这里是可以更改影响到物理表的 select * from emp_n_avgsal; update emp_n_avgsal set avg_sal where ename='guozhen';-- 在这里操作会失败 -- create [algorithm={undefined|merge|temptable} create algorithm=merge view emp_v1 as select * from emp where deptno=2;