一、视图***
视图是一条SQL语句的查询结果所构成的虚拟表
并不是物理存在的,使用方式与普通表相同
视图的作用:简化了SQL语句的缩写;
限制可查询的数据(可以使用权限来完成,权限到某一个库的某一个表的某一个字段)
视图的特点:对于限制的增删改查都会同步到原始表,每一次对视图的查询,本质上是执行了之前创建视图时指定的SQL语句
对于原始表的修改,也能在视图中查看到,前提是修改的数据要包含在创建视图时指定的SQL语句中
创建视图的语法:create [or replace] view view_name as sql语句;
修改视图的语法:alter view view_name as sql语句;
删除视图的语句:drop view view_name;
二、触发器***
什么是触发器:使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
触发器是一段与某个表有关的mysql的程序
当达到某种条件时,触发某个东西的执行
使用触发器的条件:时间点:before after
具体事件:update 中包含new,old
delete中只有old
insert中只有new
达到条件后会自动执行一段mysql程序
触发器的作用:比如做一个博客系统,需要在执行更新时,自动记录更新时间以及更新的具体的内容
换句话说,就是可以帮你带一个表被修改时,做一些额外的操作
1 create trigger name after delete on tablename for each row 2 begin 3 #具体要执行的操作 4 end
在触发器中有两个隐藏的对象:new(新的数据) 和 old(旧的数据)
1 创建一个博客表 2 id title content commit_time 3 4 更新记录表 5 id content update_time b_id 6 7 8 创建触发器 9 #在blog表发生了update事件时,要自动将更新后的数据插入到记录表 10 #重定义结束符号为 // 因为触发器中包含分号,而分号是默认的结束符,所以要重新定义结束符为 // 11 12 delimiter // 13 create trigger t1 after update on blog for each row 14 begin 15 insert into update_log value(null,new.content,now(),new.id); 16 end // 17 delimiter; 18 19 select *from users //
1 cmd表存储的是什么时间执行了什么指令,得到的结果是什么 2 errlog表存储的是所有执行失败的指令信息 3 当数据插入cmd表时,会做出判断,如果success为no,就将这个信息插入errlog表中 4 5 delimiter || 6 create trigger t3 after insert on cmd for each row 7 begin 8 select *from cmd; 9 if new.success = "no" then 10 insert into errlog values(null,new.cmd,now()); 11 end if ; 12 end || 13 delimiter ; 14 #触发器不会影响原表的操作,只是增加了一些额外的操作
注意: 有a表 和 b表
b表有外键,b表的外键关联了a的主键,并且设置了级联,删除和更新
当删除a表中的记录时,并不会触发b表的触发器
三、事务******
事务保证了一件事情的完整性,比如银行转账,要么转成功,要么转失败。不可能存在一方扣款了,因为断电等操作,而导致另一方钱没有到账
事务是逻辑上一组SQL语句的集合
特点是:一个事务的所有SQL语句,要么全部成功,要么全部失败
事务的强大之处:当发生一些不可控制的因素时,可以保证数据是完整的额
1 start transaction;#开启事务 2 3 #从alan账户转走100元 4 update account set money = money - 100 where name = "alan"; 5 6 #转入kobe账户100元 7 update account set money = money + 100 where name = "kobe"; 8 9 #如果发生错误(断电,系统崩溃等因素),可以回滚 10 rollback; 11 12 #如果没有发生错误,没有任何问题那就直接提交,只有执行了提交操作,两个账户的钱才会被修改 13 commit #提交事务 14 15 #一旦执行了commit 就不可能再回滚
rollback是全部撤销(回滚)
savepoint 可以创建保存点,可以选择性的回滚一部分
事务的四个特征:
1.原子性:一个事务是一个整体,不可拆分的
2.一致性:所有的数据都是完整的(外键约束,非空约束)
3.隔离性:两个事务之间相互独立(与效率相关)
4.永久性:一个事务一旦提交,那就是永久性的,不能再回滚
四种隔离级别:读未提交、读已提交、可重复读(作为默认的)、串行化(最严格的锁,但是性能低)
四、存储过程*****
一个存储过程中包含任意SQL语句,以及流程控制,事务等等
就是将一系列较为复杂的逻辑封装到了mysql中
好处:将业务逻辑放到mysql中来处理,可以降低网络访问次数,以此来提高程序效率
弊端:学习成本高,运营成本高,沟通成本高(三高)
三种开发的模型:
1.营运程序开发者只关注业务逻辑,数据相关的逻辑交给存储过程
优点:优化网络
缺点:耦合度降低了;学习成本高,运营成本高,沟通成本高;存储过程移植性很差,每种数据语法都不一样
2.营运程序开发者不仅关注业务逻辑,还要编写原生的SQL语句
优点:一个人负责全部,没有沟通成本
缺点:SQL语句编写繁琐,导致开发效率低
3.应用程序开发者仅关注业务逻辑,把SQL语句相关的交给ORM框架(对象关系映射,封装了增删改查,自动生成sql语句)
优点:开发效率高
缺点:执行效率较低
创建存储过程与函数的区别:函数仅仅是一个单纯的工具,与数据无关,所以函数中不能出现SQL语句,存储过程既可以包含mysql的逻辑代码,也能包含SQL语句
浙公网安备 33010602011771号