MySQL ------ 视图(二十三)

视图:一种查看数据库中一个或多个表中数据的方法。是一个虚拟的表,通常作为来自一个或多个表的行或列子集创建的,也可以包含全部的行和列,充当着查询中表的选择器角色,定义视图可以基于一个表或多个表,也可以基于其他视图或其他数据库,本质是基于SQL语句地结果集,所以对视图的操作不会影响到实际的数据。对查询执行的大多数操作可在视图上进行,视图只包含使用时动态检索数据的查询。

使用视图的原因:一是出于安全考虑,用户不必看到整个数据库的结构,而隐藏部分数据,二是符合用户日常业务逻辑,使他们更容易理解数据。

版本:MySQL 的版本需要适用与MySQL 5 以后的版本。

使用场景:将重复使用的复杂查询结果保存为视图,设置不同访问权限的视图等

常用来进行的操作:筛选表中的行,防止未经许可的用户访问敏感数据,将多个物理数据表抽象为一个逻辑数据表。

使用视图的好处:对于用户(结果更容易理解,回去数据数据更容易),对于开发(限制数据检索更容易,维护程序更方便)

使用视图(VIEW)的主要方式:创建,查看,删除,更新

-- 创建语法
create view 视图名 as <select 语句>

-- 删除语法
drop view [if exists] 视图名

 

一、视图使用create view 语句来创建

ONE、利用视图简化复杂的联结(多表)

视图最常用的应用之一是隐藏复杂的SQL

-- 创建视图 create view 视图名 as 查询语句
create view view_product_customers as
   select  cust_name,cust_contact,orders.cust_id,orders.order_num,prod_id from customers,orders,orderitems
      where customers.cust_id = orders.cust_id and orders.order_num = orderitems.order_num;

 可以和查询表一样使用视图

从中可以看出,视图极大的简化了复杂的SQL 语句使用,建议创建一些不受特定数据限制的视图,这样不仅使他可以多次重用,而且,也不需要创建和维护多个类似的视图。

TWO、用视图重新格式化检索出的数据(concat)

-- 视图的字段就是 as  的字段
 create view view_namecity as
        select vend_id,vend_name,concat(rtrim(vend_name),'(',rtrim(vend_country),'_', rtrim(vend_city),')') 
          as vend_name_country_city from  vendors order by vend_name;

 

从中可以看出,视图可以将格式化后的数据作为一个新列进行展示,而且使用排序时也是根据最新指示

Three、使用视图过滤不想要的数据(where )

-- 与where子句连用
mysql> create view view_customer_email_notNULL  as 
    ->   select cust_id,cust_name,cust_email from customers
    ->       where cust_email is not null;

 如上所示;视图也可使用where 子句,若创建视图的查询语句中有where 子句,那么视图的where 子句将会与里面的自动组合。

Four、使用视图与计算字段

mysql> create view view_orderitems_totalprice as
    ->   select prod_id,quantity,item_price, item_price*quantity as total_price
    ->       from orderitems;

 

 

 从中可以看出,视图容易创建,而且很好使用,可以极大的简化复杂的数据处理。

 二、使用show create view viewname ,语句来查看创建视图的语句

-- show create view viewname 
show create view view_product_customers;

查看库中有几个视图,建议起名字的时候要规范一些,这样好识别

 

 

 

三、使用 drop view viewname 语句来删除视图 

-- drop view  视图名;
 drop view view_product_customers;

 

 

 注意:不能用删除表的语句删除哦

 

 

 

四、更新视图,可以先drop 在 create ,也可以直接用create or replace view 

            如果要更新的视图不存在,使用create or replace view 更新语句会创建一个视图;

     如果要更新的视图存在,使用create or replace view 更新语句会替换原有视图

通常视图是可更新的(即insert,update,delete),但是视图本身就是一个查询语句,所以更新视图的本质就是更新其基表,但是并非所有的视图都是可更新的,如果MySQL不能正确的确定被更新的基数据,则不允许更新(包括增加删除)

注意:如果视图定义中有以下几种情况都不能更新

1、分组(使用group by 和 having)

2、联结

3、子查询

4、并

5、聚集函数(min(),count(),sum() 等)

6、distinct

7、导出(计算)列

因此本文中例子都不能更新,而且这个也基本用不到,因为视图就是用于检索数据,不用于更新(insert,update,delete)

 

如何区分视图和表:

在mysql 安装成功后会自动创建系统数据库 information_schema 在给i数据库中会存在一个包含视图信息的表 views ,可以通过views 查看所有视图的相关信息

-- 查看所有视图
use information_schema;
select * from views\G;

 

 

 

 

!!!! END

视图是一个虚拟的表,它包含的不是数据而是根据需要检索数据的查询。视图提供了一种mysql 的select 语句层次的封装,可以简化数据处理以及重新格式化基础数据或保护基础数据。

使用视图的好处:

1、重用SQL 语句

2、简化复杂的SQL 操作。在编写查询后,可以方便的重用他而不不必知道他的基本查询查询细节。

3、使用表的组成部分而不是整个表

4、保护数据。可以给用户授予特定部分的访问权限而不是整个表的访问权限

5、更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据

6、在视图创建之后,可以与表基本相同的方式利用它们,如对视图执行select操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加和更新数据(不过增加和更新存在某些限制)

 

注意事项:

1、视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它里面的数据是从其他表中检索出来的,会受到其他表的添加或更改发生改变

2、与表名一样,视图必须唯一命名(在这个数据中不能有和他一样名字的表或视图)

3、对于可以创建的视图数目没有限制。

4、为了创建视图必须具有足够的访问权限(一般由数据库管理员授予)

5、视图可以嵌套,可以利用从其他视图中检索数据的查询来构造一个新的视图,但最好不要超过三层

6、order by 也可以用于视图中,但如果该视图的select 语句也含有order by,那么该视图中的order by 将被覆盖

7、视图不能索引,也不能有关联的触发器或默认值

8、表与视图可以放在一块使用(编写一条连接表和视图的select 语句)

9、由于视图本身不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索,特别是使用多个联结创建了复杂的视图或使用视图嵌套视图的时候,他的性能可能会下降的比较厉害。

10,对视图进行 add,update,delete操作不影响原表中的数据,但是当视图中的数据来自于多个表时,不允许添加和删除数据

 

 

 

 

 

 

 

 

posted on 2020-06-09 22:27  obge  阅读(363)  评论(0编辑  收藏  举报