mysql/MariaDB学习2.4 mysql视图

环境:

CentOS 7,mysql5.7

摘要说明:

数据库视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句。 因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据。 大多数数据库管理系统(包括MySQL)允许您通过具有一些先决条件的数据库视图来更新基础表中的数据。

本篇文章主要简述下mysql视图类型、创建、使用及相关特性;

步骤:

1.什么是视图

       视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。下图可以很好的阐述:

       数据库视图是动态的,因为它与物理模式无关。数据库系统将数据库视图存储为具有连接的SQL SELECT语句。当表的数据发生变化时,视图也反映了这些数据的变化。

2.mysql视图类型

视图主要分为可更新及不可更新;这主要取决于算法;mysql主要有三种算法:

  • 使用MERGE算法,MySQL首先将输入查询与定义视图的SELECT语句组合成单个查询。 然后MySQL执行组合查询返回结果集。 如果SELECT语句包含集合函数(如MIN,MAX,SUM,COUNT,AVG等)或DISTINCT,GROUP BY,HAVING,LIMIT,UNION,UNION ALL,子查询,则不允许使用MERGE算法。 如果SELECT语句无引用表,则也不允许使用MERGE算法。 如果不允许MERGE算法,MySQL将算法更改为UNDEFINED。请注意,将视图定义中的输入查询和查询组合成一个查询称为视图分辨率。
  • 使用TEMPTABLE算法,MySQL首先根据定义视图的SELECT语句创建一个临时表,然后针对该临时表执行输入查询。因为MySQL必须创建临时表来存储结果集并将数据从基表移动到临时表,所以TEMPTABLE算法的效率比MERGE算法效率低。 另外,使用TEMPTABLE算法的视图是不可更新的。
  • 当您创建视图而不指定显式算法时,UNDEFINED是默认算法。 UNDEFINED算法使MySQL可以选择使用MERGE或TEMPTABLE算法。MySQL优先使用MERGE算法进行TEMPTABLE算法,因为MERGE算法效率更高。

创建视图时,可指定视图类型:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
   [WITH [CASCADED | LOCAL] CHECK OPTION]

上述所说视图含有下述查询组合则不可使用MERGE算法:

  • 聚合函数,如:MIN,MAX,SUM,AVG,COUNT等。
  • DISTINCT子句
  • GROUP BY子句
  • HAVING子句
  • UNION或UNION ALL子句
  • 左连接或外连接。
  • SELECT子句中的子查询或引用该表的WHERE子句中的子查询出现在FROM子句中。
  • 引用FROM子句中的不可更新视图
  • 仅引用文字值
  • 对基表的任何列的多次引用

3.创建视图

视图创建的语句格式如下:

CREATE [OR REPLACE]   
  [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]  
  [DEFINER = { user | CURRENT_USER }]  
  [SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]  
AS select_statement  
  [WITH [CASCADED | LOCAL] CHECK OPTION]

注: 

1、ALGORITHM选项:选择在处理定义视图的select语句中使用的方法

  • UNDEFINED:MySQL将自动选择所要使用的算法
  • MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
  • TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
  • 缺省ALGORITHM选项等同于ALGORITHM = UNDEFINED

2、DEFINER选项:指出谁是视图的创建者或定义者

  • definer= '用户名'@'登录主机'
  • 如果不指定该选项,则创建视图的用户就是定义者,指定关键字CURRENT_USER(当前用户)和不指定该选项效果相同

3、SQL SECURITY选项:要查询一个视图,首先必须要具有对视图的select权限。但是,如果同一个用户对于视图所访问的表没有select权限,那会怎么样?
SQL SECURITY选项决定执行的结果:

  • SQL SECURITY DEFINER:定义(创建)视图的用户必须对视图所访问的表具有select权限,也就是说将来其他用户访问表的时候以定义者的身份,此时其他用户并没有访问权限。
  • SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限。
  • 缺省SQL SECURITY选项等同于SQL SECURITY DEFINER 

视图权限总结:使用root用户定义一个视图(推荐使用第一种):u1、u2

  • u1作为定义者定义一个视图,u1对基表有select权限,u2对视图有访问权限:u2是以定义者的身份访问可以查询到基表的内容;
  • u1作为定义者定义一个视图,u1对基表没有select权限,u2对视图有访问权限,u2对基表有select权限:u2访问视图的时候是以调用者的身份,此时调用者是u2,可以查询到基表的内容。

4、WITH CHECK OPTION约束

  • 对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。

通常创建视图的数据来源有

  • 基于单表过滤部分数据封装成视图
  • 基于多表组合查询封装成视图
  • 基于已有视图查询封装成新的视图

下属三个实例对应上述三种视图:

单表:

CREATE VIEW officeInfo AS SELECT
	officeCode,
	phone,
	city
FROM
	offices;

 多表组合:

CREATE VIEW v_match AS SELECT
	a.PLAYERNO,
	a. NAME,
	MATCHNO,
	WON,
	LOST,
	c.TEAMNO,
	c.DIVISION
FROM
	PLAYERS a,
	MATCHES b,
	TEAMS c
WHERE
	a.PLAYERNO = b.PLAYERNO
AND b.TEAMNO = c.TEAMNO;

视图: 

CREATE VIEW v_match_1 AS SELECT
	*
FROM
	v_match
WHERE
	PLAYERNO LIKE '2018%';

在数据库中,视图和表共享相同的命名空间,因此视图和表不能具有相同的名称。 另外,视图的名称必须遵循表的命名规则。

因为视图和表共享相同的命名空间。要知道哪个对象是视图或表,请使用SHOW FULL TABLES命令,如下所示:

mysql> SHOW FULL TABLES;
+--------------------+------------+
| Tables_in_yiibaidb | Table_type |
+--------------------+------------+
| orders             | BASE TABLE |
| payments           | BASE TABLE |
| productlines       | BASE TABLE |
| products           | BASE TABLE |
| saleperorder       | VIEW       |
+--------------------+------------+

SELECT语句必须遵循以下几个规则:

  • SELECT语句可以在WHERE子句中包含子查询,但在MySQL 5.7.7之前版本,是不能在SELECT语句的FROM子句中使用子查询来定义视图的。
  • SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。
  • SELECT语句不能引用准备语句的参数。

4.视图的使用

视图主要是用来进行数据筛选;故主要还是进行数据查询;单可更新的视图仍可进行编辑和删除但这里不推荐使用;

视图的操作如表结构一致;这里就不赘述;

5.视图数据的一致性

视图数据的一致性指的是上述可更新的视图可以通过insert、update来更新视图从而更新基础表数据;

  • 若新增的一条数据到视图但却不满足视图创建的筛选条件;
  • 若修改数据使得修改后的数据不满足该视图创建的筛选条件;

上述两种更新使视图不一致。为了确保视图的一致性,在创建或修改视图时使用WITH CHECK OPTION子句。

CREATE OR REPLACE VIEW view_name 
AS
  select_statement
  WITH CHECK OPTION;

加上上述则新增修改的数据如果不满足视图的筛选条件则不可更新; 

6.视图的优缺点

数据库视图的优点:

  • 数据库视图允许简化复杂查询:数据库视图由与许多基础表相关联的SQL语句定义。 您可以使用数据库视图来隐藏最终用户和外部应用程序的基础表的复杂性。 通过数据库视图,您只需使用简单的SQL语句,而不是使用具有多个连接的复杂的SQL语句。
  • 数据库视图有助于限制对特定用户的数据访问。 您可能不希望所有用户都可以查询敏感数据的子集。可以使用数据库视图将非敏感数据仅显示给特定用户组。
  • 数据库视图提供额外的安全层。 安全是任何关系数据库管理系统的重要组成部分。 数据库视图为数据库管理系统提供了额外的安全性。 数据库视图允许您创建只读视图,以将只读数据公开给特定用户。 用户只能以只读视图检索数据,但无法更新。
  • 数据库视图启用计算列。 数据库表不应该具有计算列,但数据库视图可以这样。 假设在orderDetails表中有quantityOrder(产品的数量)和priceEach(产品的价格)列。 但是,orderDetails表没有一个列用来存储订单的每个订单项的总销售额。如果有,数据库模式不是一个好的设计。 在这种情况下,您可以创建一个名为total的计算列,该列是quantityOrder和priceEach的乘积,以表示计算结果。当您从数据库视图中查询数据时,计算列的数据将随机计算产生。
  • 数据库视图实现向后兼容。 假设你有一个中央数据库,许多应用程序正在使用它。 有一天,您决定重新设计数据库以适应新的业务需求。删除一些表并创建新的表,并且不希望更改影响其他应用程序。在这种情况下,可以创建与将要删除的旧表相同的模式的数据库视图。

出来上述说的优点,视图仍有下述缺点:

  • 性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
  • 表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。

猜你喜欢

转载自blog.csdn.net/u010904188/article/details/82682987