视图
视图是MySQL中的一个虚拟表的概念,类似于一个SQL语句的查询结果,它提供了从某一视角来看表的类型;将
一个表中不该显示的数据或列剔除;而得到自己想要的数据;
视图一般应用于简化复杂的SQL语句,比如在需要大量使用一些复杂多个条件的查询时,建立符合其中条件的SQL语句显示的视图,可以快速的将视图的SQL语句进行一个复用,即只需要从视图中获取数据即可;
另外,除了简化复用SQL语句,它还对于原来的数据表起了一个保护作用,视图可以返回和原表数据格式不相同的数据,通过设置还可让用户对视图的操作不影响源数据表;
使用
- 使用CREATE VIEW [view_name] as [SQL语句];来创建视图;
- 使用SHOW CREATE VIEW 【视图名】;来查看视图创建语句;
- 使用DROP VIEW [view_name]删除视图;
- 使用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 中的值全都是只读的,不能更新。
触发器的创建需要安全访问权限,执行是自动的;
触发器可以用于保证数据一致性和创建审计跟踪;