一、视图
视图的含义:
视图是一个虚拟表,是从数据库中一个或者多个表中导出来的表。
1、创建视图
#语法:CREATE VIEW 视图名称 AS SQL语句 create view teacher_view as select tid from teacher where tname='李平老师'; #于是查询李平老师教授的课程名的sql可以改写为 mysql> select cname from course where teacher_id = (select tid from teacher_view); +--------+ | cname | +--------+ | 物理 | | 美术 | +--------+ rows in set (0.00 sec) #!!!注意注意注意: #1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高 #2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图, 那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责, 你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
2、查看视图
select * from course_view;
create view view_sc as select * from sc; select * from view_sc; desc view_sc;
show create view view_sc;
3、修改视图
修改视图:
语法:ALTER VIEW 视图名称 AS SQL语句
ALTER alter view view_sc as select * from student; select * from view_sc;
查看数据库中原有的视图
select * from information_schema.views;
4、更新视图
更新视图是指通过插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录建立视图一般是为了查看,不建议更新操作
5、删除视图
语法:DROP VIEW 视图名称 DROP VIEW teacher_view
二、事务
1、定义
事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被执行
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性
2、事务的ACID原则
ACID,指数据库事务正确执行的四个基本要素的缩写。 包含:原子性(Atomicity)、最小单元,保证一个操作作为一个过程去处理一致性(Consistency)、如果其中有任何步骤失败,整个过程回滚(回到原始状态)隔离性(Isolation)、事物之间互不影响,相互独立持久性(Durability),事务提交成功后,会永久的存储,状态不会再改变 一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。 使用场景: 银行的交易系统 eg: start transaction; update user set balance = 900 where name = 'wsb'; #买支付100元 update user set balance = 1010 where name = 'egon'; #中介拿走10元 uppdate user set balance = 1090 where name = 'ysb'; #卖家拿到90元,出现异常没有拿到 rollback; commit;
3、MYSQL事务实现的方法
(1)set autocommit
使用set语句来改变自动提交模式
SET AUTOCOMMIT = 0; # 关闭自动提交模式 SET AUTOCOMMIT = 1; # 开启自动提交模式
MySQL中默认是自动提交 使用事务时应先关闭自动提交
1 查看提交模式 select @@autocommit;
2 关闭自动提交模式
set autocommit=0;
案例分析:
顾客A在线购买一款商品,价格为500.00元,采用网上银 行转账的方式支付 假如顾客A银行卡的余额为2000.00元,且向卖家B支付购 买商品费用500.00元,起始卖家B的账号金额10000.00元 创建数据库shop和创建表account并插入2条数据
创建表 shop表 create table shop( name VARCHAR(32) not null, cash int(4) ); 插入数据: insert into shop VALUES('A',2000),('B',10000)
插入数据不成功,因为上一步把自动提交关闭了
set autocommit=1;
insert into shop VALUES('A',2000),('B',10000)
关闭自动提交模式
set autocommit=0;
4、事务的语法
关闭自动提交模式 set autocommit=0; start transaction; update shop set cash=cash-500 where name='A'; update shop set cash=cash+500 where name='B';
select * from shop;没有提交,只是显示操作后的状态,但实际数据依旧没变
ROLLBACK; 没有commit回滚回到原来的状态 commit; 先提交再回滚,也不会回到最初的状态,而是出现提交后的状态最后还原自动提交模式set autocommit=1;
三、触发器
trigger 英 /'trɪgə/ 美 /'trɪɡɚ/ vt 触发、引发
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
1、定义
在某种操作执行的同时触发另一种操作。它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
2、触发器的语法
3、案例分析
student表 每插入一条数据,计数表就计数 由于没有计数表,先创建 create table account( stu_count int(4), change_time datetime ); 触发器 create trigger tir_stu after insert on student for each row begin update account set stu_count=stu_count+1,change_time=now(); end; 先运行触发器,创建触发器 select * from account; 在执行插入之前必须要数据 INSERT into account VALUES((select count(*) from student),NOW()); student表插入数据 INSERT into student VALUES(1014,'cc',12,1);
4、触发器的删除
drop trigger 触发器名
MySQL触发器是在5.0版本引入的。针对需要对数据库做级联更改是很适宜使用的,如需要实时监控某张表中的某个字段的更改而需要做出相应的处理。 触发器虽然功能强大,能轻松可靠的实现许多复杂的功能不过,要慎用触发器,滥用触发器会造成数据库以及应用程序维护困难。
来源:https://www.cnblogs.com/foremostxl/p/11409499.html