MySQL基础(8)——视图、存储过程

来源:互联网 发布:谜画之塔mac版 编辑:程序博客网 时间:2024/06/10 23:23

本文主要整理什么是视图、存储过程、它们怎样工作,以及何时使用它们。

MySQL5及以上版本才支持视图、存储过程

一、视图

视图:视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。它仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。 在添加或更改这些表中的数据时,视图将返回改变过的数据。

  1. 视图的常见应用:
    (1). 重用SQL语句。
    (2). 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
    (3). 使用表的组成部分而不是整个表。
    (4). 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
    (5). 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

  2. 视图的使用:

关键词:CREATE VIEWSHOW CREATE VIEW viewname、DROP

在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据
——导致性能问题:因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降得很厉害。因此,在部署使用了大量视图的应用前,应该进行测试。

视图创建和使用的一些最常见的规则和限制:
   (1)视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
   (2) 对于可以创建的视图数目没有限制。
   (3)为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。
   (4)视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造 一个视图。
   (5)ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。
   (6)视图不能索引,也不能有关联的触发器或默认值。
   (7)视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。

实例1:利用视图简化复杂的联结

这里写图片描述

检索订购了产品TNT2的客户,可用如下表示(与前几篇中相同例子的处理进行比较):
这里写图片描述

创建不受特定数据限制的视图是一种好办法。例如,上面创建的视图返回生产所有产品的客户而不仅仅是生产TNT2的客户。扩展视图的范围不仅使得它能被重用,而且甚至更有用。这样做不需要创建和维护多个类似视图。

实例2:重新格式化检索出的数据

这里写图片描述

实例3:用视图过滤掉不想要的数据

这里写图片描述

如果从视图检索数据时使用了一条 WHERE子句,则两组子句(一组在视图中,另一组是传递给视图的)将自动组合。

实例4:使用视图与计算字段

这里写图片描述

  3.视图的更新

对视图使用INSERT、UPDATE和 DELETE实现更新。更新一个视图将更新其基表。如果你对视图增加或删除行,实际上是对其基表增加或删除行。

不能更新视图的情况(即MySQL不能正确地确定被更新的基数据的情况):
  1. 分组(使用GROUP BY和HAVING);
  2. 联结;
  3. 子查询;
  4. 并;
  5. 聚集函数(Min()、Count()、Sum()等);
  6. DISTINCT;
  7. 导出(计算)列。

一般,应该将视图用于检索(SELECT语句) 而不用于更新(INSERT、UPDATE和DELETE)。

二、存储过程

存储过程:为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,但它们的作用不仅限于批处理。

  1. 存储过程的意义: 简单、安全、高效
    (1). 通过把处理封装在容易使用的单元中,简化复杂的操作。
    (2). 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能 性就越大。防止错误保证了数据的一致性。
    (3). 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容) 有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。——保证安全性(通过存储过程限制对基础数据的访问减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。)
    (4). 提高性能。因为使用存储过程比使用单独的SQL语句要快。
    (5). 存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码。

  2. 存储过程的缺陷:
    (1). 一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。
    (2). 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建权限,允许用户使用存储过程,但不允许他们创建存储过程。

  3. 存储过程的使用

关键词:CALL;CREATE PROCEDURE

实例1:创建一个返回产品平均价格的存储过程

这里写图片描述

对于mysql命令行实用程序: 默认的MySQL语句分隔符为;mysql命令行实用程序也使用;作为语句分隔符。如果命令行实用程序要解释存储过程自身内的;字符,则它们最终不会成为存储过程的成分,这会使存储过程中的SQL出现句法错误。解决办法是临时更改命令行实用程序的语句分隔符,如实例1所示。其中,DELIMITER //告诉命令行实用程序使用//作为新的语句结束分隔符,可以看到标志存储过程结束的END定义为END //而不是END;。这样,存储过程体内的;仍然保持不动,并且正确地传递给数据库引擎。最后,为恢复为原来的语句分隔符,可使用DELIMITER ;。

除\符号外,任何字符都可以用作语句分隔符。

实例2:使用存储过程

这里写图片描述

实例3:删除存储过程

这里写图片描述

为使过程不存在时不至于产生错误,可使用DROP PROCEDURE IF EXISTS。

实例4:使用参数的存储过程

这里写图片描述
这里写图片描述

所有MySQL变量都必须以@开始。

实例5:得到订单合计,并对合计增加营业税,不过只针对某些顾客。(智能存储过程)

这里写图片描述

参数taxable是一个布尔值(如果要增加税则为真,否则为假)。在存储过程体中,用DECLARE语句定义了两个局部变量。DECLARE要求指定变量名和数据类型,它也支持可选的默认值(这个例子中的taxrate的默认被设置为6%)。IF语句检查taxable是否为真,如果为真,则用另 一SELECT语句增加营业税到局部变量total。最后,用另一SELECT语句将 total(它增加或许不增加营业税)保存到ototal。

实例6:检查存储过程

这里写图片描述这里写图片描述

SHOW PROCEDURE STATUS列出所有存储过程,可用LIKE指定一个过滤模式,来限制其输出。

阅读全文
0 0
原创粉丝点击