MySQL视图、存储过程与触发器;

视图

视图是MySQL中的一个虚拟表的概念,类似于一个SQL语句的查询结果,它提供了从某一视角来看表的类型;将
一个表中不该显示的数据或列剔除;而得到自己想要的数据;
视图一般应用于简化复杂的SQL语句,比如在需要大量使用一些复杂多个条件的查询时,建立符合其中条件的SQL语句显示的视图,可以快速的将视图的SQL语句进行一个复用,即只需要从视图中获取数据即可;

另外,除了简化复用SQL语句,它还对于原来的数据表起了一个保护作用,视图可以返回和原表数据格式不相同的数据,通过设置还可让用户对视图的操作不影响源数据表;

使用

  1. 使用CREATE VIEW [view_name] as [SQL语句];来创建视图;
  2. 使用SHOW CREATE VIEW 【视图名】;来查看视图创建语句;
  3. 使用DROP VIEW [view_name]删除视图;
  4. 使用Create OR REPLACE VIEW [view_name];来更新视图;

一个常见的应用时简化复杂的SQL语句;
假如有一多表联查的SQL,可以通过一次对于该SQL的视图创建;后续只需要直接将视图当结果表来操作即可;
另一个作用是可以通过视图来得到原来的结果:比如结果数据的筛选,数据计算和格式化因为不影响原表,所以甚至可以进行更多操作;

注意事项

视图本身不包含数据,它的数据都是原数据表中的数据,对于源数据表的更改会影响到视图,而且由于每次使用都要检索,尽量不要建立复杂的视图;

视图的一些使用规范:

  • 视图必须唯一命名;
  • 创建视图数量没有限制,但是必须对原表有足够的访问权限;
  • 视图可以嵌套使用,也可以和表一起结合使用;
  • 视图无法索引,也不能有触发器关联或默认值;

存储过程

对于项目中的数据库操作,可能不知一条语句,存储过程就是一组SQL语句的集合;执行一个存储过程就相当于执行了一组SQL语句;

使用场景:

  • 通过将一组处理封装成一个存储过程从而简化复杂操作;
  • 封装好的语句使用会避免一些多次编写过程中不必要的错误,提供语句一致性,更改表名时也不需要注意SQL语句,只需要修改存储过程即可;
  • 提高性能,它比一组SQL执行要快;

使用

创建:CREATE PROCEDURE [名称(参数)] begin ……end;来创建一个存储过程;其中begin后面时SQL语句集

CREATE PROCEDURE productpricing(
   OUT pl DECIMAL(8,2),
   OUT ph DECIMAL(8,2),
   OUT pa DECIMAL(8,2)
)
BEGIN
   SELECT Min(prod_price)
   INTO pl
   FROM products;
   SELECT Max(prod_price)
   INTO ph
   FROM products;
   SELECT Avg(prod_price)
   INTO pa
   FROM products;
END;

使用:CALL 存储过程名(存储过程参数);来使用一个已经创建好的SQL语句;
删除:DROP PROCEDURE 【过程名称】IF EXISTS;

查看已有的存储过程:SHOW CREATE PROCEDURE

使用过程中也可以结合游标使用更多功能;

触发器

触发器主要用于需要自动在某些条件下执行SQL语句的情况;MySQL中的触发器主要用于数据更改时使用(DELETE、INSERT、UPDATE);

使用

创建:

CREATE TRIGGER [触发器名称]
 AFTER/BEFORE
ON [关联表名]      (  FOR EACH ROW )   [SQL语句];

注意:视图不支持触发器,如果BEFORE失败即SQL语句失败,则不会请求,且每个事件只能由一个触发器;

删除:
DROP TRIGGER [名称]
触发器无法修改,只有增删;如果要修改只能先删除在创建;

INSERT触发器
CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT …………
- 在INSERT 触发器代码内,可引用一个名为NEW 的虚拟表,访问被插入的行;

- 在BEFORE INSERT 触发器中,NEW 中的值也可以被更新(允许更改被插入的值);

- 对于AUTO_INCREMENT 列,NEW 在INSERT 执行之前包含0 ,在INSERT 执行之后包含新的自动生成值。

DELETE触发器
CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW …………
- 在DELETE 触发器代码内,你可以引用一个名为OLD 的虚拟表,访问被删除的行;

- OLD 中的值全都是只读的,不能更新。

UPDATE 触发器
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW …………
- 在UPDATE 触发器代码中,你可以引用一个名为OLD 的虚拟表访问以前(UPDATE 语句前)的值,引用一个名为NEW 的虚拟表访问新更新的值;

- 在BEFORE UPDATE 触发器中,NEW 中的值可能也被更新(允许更改将要用于UPDATE 语句中的值);

- OLD 中的值全都是只读的,不能更新。

触发器的创建需要安全访问权限,执行是自动的;
触发器可以用于保证数据一致性和创建审计跟踪;

Guess you like

Origin blog.csdn.net/qq_44830792/article/details/121516377