MySQL 视图与触发器

MySQL 视图与触发器

什么是视图

视图(VIEW)是一种数据库虚拟表,只包含使用时动态检索数据的查询

  • 视图是一个虚拟表(内容由查询定义)
  • 视图包含行和列字段数据(同真实表一样)
  • 视图并不在数据库中存储数据(显示查询结果)
  • 视图数据动态变化(查询的真实表数据改变)

在视图创建之后,可以用与表基本相同的方式使用视图。可以对视图执行SELECT操作,过滤和排序数据,将视图连接到其他视图或表,甚至能添加和更新数据(存在某些限制)

视图仅仅是是用来查看存储在别处的数据的一种方式。视图本身不包含 数据,因此他们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据

视图操作

创建视图

语法:

CREATE VIEW ‘视图名’AS‘查询SQL语句’

视图常见应用

  • 使用视图简化联表查询(隐藏复杂的SQL语句)
  • 使用视图重新格式化查询的数据
  • 使用视图过滤不想要的数据
  • 使用视图计算多个字段
更新视图

语法:

ALTER VIEW ‘视图名’ AS ‘更新SQL语句’

  • 视图是可更新的,可以对视图进行INSERT、UPDATE和DELETE操作。更新一个视图将更新其真实表(视图只是虚拟表)。如果对视图进行增加或删除记录,实际上是对其真实表增加或删除行。
  • 并非所有视图都是可更新的。如果MySQL不能正确地确定被更新的真实数据,则不允许更新(包括插入和删除)。如果视图定义中有分组(GROUP BY和HAVING)、联表操作、子查询、聚集函数(Min、Count、Sum等)、DISTINCT(去重复)、计算列, 则不能进行视图更新。
查看视图

语法:

SHOW CREATE VIEW ‘视图名’

查看所有视图方法:

show table status where comment='view'; 
删除视图

语法:

DROP VIEW ‘视图名’

删除多个视图方法:

drop view viewname1,viewname2,…

视图的规则与限制

  • 视图必须唯一命名(不能给视图取与别的视图或表相同的的名字)
  • 视图创建需要具有足够权限
  • 视图创建数量上没有限制
  • 视图可以嵌套(可以利用从其他视图中检索的数据的查询来构造一个视图)
  • 视图允许使用 order by 进行排序(如果从该视图检索数据select中也含有order by则该视图中的order by将会被覆盖而失效)
  • 视图不能索引(不支持触发器)
  • 视图可以和表一起使用

视图的作用

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

使用视图的注意事项

性能问题

因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一检索。如果使用多个连接表和查询条件创建了复杂的视图或嵌套了视图,可能会发现性能下降得比较厉害。因此,在部署使用了大量视图的应用前,应该进行性能测试。

创建视图尽量简单,避免视图嵌套


什么是触发器

触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。

触发器的使用

创建触发器

语法一:

CREATE TRIGGER ‘触发器名’BEFORE|AFTER ‘触发事件’ ON ‘表名’FOR EACH ROW ‘执行语句’

语法二:

CREATE TRIGGER ‘触发器名’BEFORE|AFTER ‘触发事件’ ON ‘表名’FOR EACH ROW BEGIN‘执行语句列表’END

  • BEFORE|AFTER-触发器可在一个触发事件发生之前或之后执行
  • FOR EACH ROW-触发器对触发事件改变的数据表每一条记录执行
  • 执行语句-触发器执行的SQL语句(支持一个或多个执行语句)

注意:视图不支持触发器

查看触发器

语法:

SHOW TRIGGERS;

删除触发器

语法:

DROP TRIGGER ‘触发器名’;

  • 触发器不能更新或修改,需要修改触发器必须先删除再重新创建

触发器的使用

触发器种类

  • INSERT 触发器
  • DELETE 触发器
  • UPDATE 触发器

触发器触发时机

  • 触发事件前(Before)
  • 触发事件后(After)

注意:每个表最多支持6个触发器,单个触发器不能与多个事件或多个表关联

posted @ 2021-09-13 19:10  嘛了对就念来过倒  阅读(298)  评论(0编辑  收藏  举报