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将会被覆盖而失效)
- 视图不能索引(不支持触发器)
- 视图可以和表一起使用
视图的作用
- 重用 SQL 语句
- 简化复杂的 SQL 操作(在编写查询后,可以方便地重用视图而不必知道视图的基本查询细节)
- 使用表的组成部分,而不是整张表
- 保护数据(可以给用户授予表的特定部分的访问权限而不是整个表的访问权限)
- 更改数据格式和表示(视图可返回与底层表的表示和格式不同的数据)
使用视图的注意事项
性能问题
因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一检索。如果使用多个连接表和查询条件创建了复杂的视图或嵌套了视图,可能会发现性能下降得比较厉害。因此,在部署使用了大量视图的应用前,应该进行性能测试。
创建视图尽量简单,避免视图嵌套
什么是触发器
触发器(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个触发器,单个触发器不能与多个事件或多个表关联