视图定义:是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影。
同一张表可以创建多个视图。
创建视图的语法:
create view viewName as select语句
查询视图:和表一样,可以添加where条件。
修改视图:alter view viewName as select * from…
删除视图:drop view viewName.
查看视图结构:和表一样 desc viewName.
查看所有视图:show tables;注意没有show views语句。
也可以试试这个语法:show full tables where table_type like ‘VIEW’;
视图的作用:
1、简化查询
例如:查询价格前3高的商品。
传统sql实现:
select catId,avg(shopPrice) pj from goods group by catId order by pj limit 3;
视图实现:查询语句变简单了。
create view viewName as select catId,avg(shopPrice) pj from goods group by catId;
select * from viewName order by pj limit 3;
例如:查询商品表,以及对应的类别
传统sql实现:
select goodName,b.catName from a left join b on a.catId=b.catId;
视图实现:
create view viewName as select goodName,b.catName from a left join b on a.catId=b.catId;
select * from view viewName;
2、权限控制
例如只让一个人可以查询一张表的指定字段。
第一步:创建视图,视图中不包含限制的字段。
create view viewName as select id,name from a;
第二步:创建一个用户,授予查询权限,只能操作viewName视图。
grant select on php.viewName to 'xiaoMing'@'%' identified by '1234456';
视图和表的关系
1、视图的数据和表的数据一一对应的时,可以修改。
2、修改表,视图也自动改变。修改视图,表也自动改变。
修改视图:和修改表一样,update 视图 set …=… where …=…;
3、视图增删改也会影响表,但是视图并不是总能增删改的。
举例:一个视图是由一张表统计得到的,有一列平均值,这种情况是不能修改视图中的平均值这一列的,会报错。
4、对于视图insert还应注意,视图必须包含表中没有默认值的列。
相当于直接对原表进行操作,由于原表中该字段是不能为null的,还没有默认值,所以是不能插入的。
注意:
视图一般只用来查询,不应该执行增删改操作。
视图算法
学习链接:
1、https://www.cnblogs.com/chuanzhang053/p/9230153.html
可以根据视图创建视图
2、https://blog.csdn.net/wuqianjing/article/details/81358740
比较详细的一个链接
一、通过视图插入数据,一次只能给一张基础表插入,不能一次一条sql语句给多张基础表插入,否则会报错3.2。(要想给多张基础表插入需要分开写多条sql语句,修改删除数据同理)
二、在创建有条件限制的视图时,加上“WITH CHECK OPTION”命令。那么更新数据时不能插入或更新不符合视图限制条件的记录。不加“WITH CHECK OPTION”命令,通过视图修改,可能导致数据无故消失。在文章末尾。
3、https://blog.csdn.net/HXNLYW/article/details/81669964
写了创建视图的几点好处
一、 表做了拆分,不需要修改程序
4、https://www.jianshu.com/p/27b4fee28ff6
更新视图的操作不能使用在计算出来的或者统计的列上
5、https://jingyan.baidu.com/article/4f34706e7dbfb6e387b56d0f.html
当视图包含以下内容时,视图更新操作将不能执行
1.视图中不包含及表中定义非空的列;
2.在定义视图的SELECT语句后的字段列表使用了数学表达式
3.在定义视图的SELECT语句后的字段列表使用了聚合函数
4.在定义视图的SELECT语句后的字段列表使用了DISTINCT,UNION,TOP,GROUP BY 或HAVING子句
综上,对视图进行增删改非常麻烦,个人不建议使用视图直接进行更新,建议直接对基表进行操作。