什么是视图?
视图是一张虚拟的表,视图与数据库中存在的表不太相同。之前我们创建的表都是包含数据的,如用户信息订单信息。然而视图是不包含数据的。
举例:
查询王五的所有订单的情况,王五本身要从用户表user进行查找,王五有很多订单要用订单表中进行查找,每个订单中有很多商品要从订单详情中进行查找,订单中的商品是什么样子的要从商品表中进行查找,要使用到4张表,user 、order、orderdetail、items
select * from( (user as u inner join order as o on u.id=o.user_id) inner join orderdetail as od on o.id=od.order_id) inner join items as tm on od.item_id=tm.id where user name=‘wang’;
这样的话就把数据全部的查了出来,但是每一个需要这个数据的人都必须要了解相关联的表结构,并且要知道怎么建立查询语句和对表进行内链接或者是外链接。为了检索其他用户的相同数据必须要修改where条件并带上一大段关联查询sql语句,如果这个时候我们可以把除了where条件之外数据包装成一个虚拟表user_order_data ,就可以使用下面的方式对数据进行检索:
select * from user_order_data where username=‘wang’
按照这种方式每次查询不同的用户的时候只要修改wher条件就行,不用在重复写哪些查询和内链接的语句,这种表是一种虚拟表也叫做视图。
视图的创建
create view 视图名(列名1,列名2,列名3) as select 列名 语句
需要注意的是中间使用and相连接,select的列名和视图的列名相同
视图的删除
drop view 视图名称
视图的使用
在使用视图的时候需要注意的是:
- 视图的名称必须唯一
- 创建视图的个数是没有限制的,但是一张视图中嵌套或者关联的表过多,同样会影响查询效率引发性能问题
- 在过滤条件数据的时候,如果在创建视图的sql语句中存在where条件语句,而在使用该视图的语句中也存在where条件语句的时候,这两个where条件语句会自动组合
- 视图中不能使用索引也不能使用触发器
- 视图可以和表中的数据一起使用编辑一条联结视图和普通表的sql语句
使用视图更新数据的时候,视图本身并没有数据,所以这些操作都是直接作用到普通表中的,但是并非所有的视图都可以进行更新操作,如视图中存在分组,联结子查询组合查询聚合函数等等 都不能对视图进行更新,视图更多的是用于数据检索而不是更新操作
总结
视图是一张虚拟的表,是不带任何数据的,每次查询的时候都是从普通表中动态的获取数据并进行组合,视图可以更新数据,但是大多情况下更新操作会收到限制,**视图通常是用于对数据表进行搜索,有些时候,视图还会限制用户对表的查询操作,只赋予用户特定视图的查询操作权限,只能让用户通过视图读到特定的行或者列的数据,**避免通过数据库的权限限制行列的读取,避免权限细化