1、视图mysql
视图是个虚拟表,只存在于内存中,可是它的表结构是存在于硬盘上的。为何要用视图:使用视图咱们能够把查询过程当中的临时表摘出来,保存下来,用视图去实现,这样之后再想操做该临时表的数据时就无需重写复杂的sql了,直接去视图中查找便可,但视图有明显地效率问题,而且视图是存放在数据库中的,若是咱们程序中使用的sql过度依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,所以并不推荐使用。程序员
create view t1_view as select *from t1;sql
Create view 视图名 as sql语句;数据库
update t1 set age=88 where id = 4;网络
insert into t1_view(name,age) values('mm',67),('uiui',90);ui
drop view t1_view;spa
drop view 视图名;事务
alter view tt_view as select *from t2;内存
alter view 视图名 as 新sql语句;开发
#!!!注意注意注意:
#1. 使用视图之后就无需每次都重写子查询的sql,开发的时候是方便了不少,可是这么效率并不高,还不如咱们写子查询的效率高
#2. 并且有一个致命的问题:视图是存放到数据库里的,若是咱们程序中的sql过度依赖于数据库中存放的视图,那么意味着,一旦sql须要修改且涉及到视图的部分,则必须去数据库中进行修改,而后再到本身的应用程序里面将那个sql语句改一改,须要不少的修改工做,并而对视图的更改一般在通常中型及以上公司中数据库有专门的DBA负责,你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
这么多的弊端,为何mysql还要提供这个东西呢,有一点是由于mysql想把全部数据处理的工做所有接手过来,但其实还有其余的缘由,等咱们讲完存储过程在和你们说吧。
#3 而且注意:视图通常都是用于查询,尽可能不要修改(插入、删除等)视图中的数据,虽然有时候能够修改为功,可是尽可能不要这样作,由于这个视图多是多个表联合起来生成的一个结果,若是你修改它,可能会形成不少表里面的数据都跟着被修改了
小总结:单表查询时,能够对表实现插入和修改,可是联表时,能够插入,但不能修改。插入数据时,values()括号内写的哪一个表的字段,那么就就会给哪一个表插入数据。
2、触发器
实现对一张表操做前或者后,进行一些其余的操做。触发器是被动调用的,而且会一直伴随这张表。
表1--t1
Id name age
表2--t2
Id content tid(这个是t1表的id)
Delimiter //#从新声明一个结束符
Create trigger tri_1 after(befor) insert(update,delete) on t2 for each row #建立一个触发器,没有结束符
If new.tid > 5 then #使用if判断
Insert into t1(name,age) values(‘uuuu’,new.tid);#对t2操做完后,对t1进行的操做
End if;# if操做结束
End // #触发器内容执行完毕
Delimiter ;#把结束符再声明回分号“;”
删除触发器:
drop trigger 触发器名字;
3、事务
把多个sql语句绑定在一块儿执行,而且其中某个没有执行成功,只要没有commit,就还能够回滚rollback。
start transaction;
insert into t1(name,age) values('11211aaaaa',24);
insert into t3(name,age) values('bbbbbbb',67);#实际没有t3表,因此会报错
insert into t2(content,tid) values('ccccccc', 13);
上面第二条插入数据的sql语句报错,因此rollback回滚一下,回到原来的数据。
4、存储过程
把sql语句作成一个过程,这样方便程序员调用。存储过程有其本身的优缺点:
优势:
#1. 用于替代程序写的SQL语句,实现程序与sql解耦
#2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
缺点:
#1. 程序员扩展功能不方便
delimiter // #声明一个结束符
create procedure p1() #建立一个存储过程
Begin #开始
select *from t1;#过程当中执行的sql语句
insert into t2(content,tid) values('9090ooiioijkkj',6);#过程当中执行的sql语句
end // #执行完毕
delimiter ; #把结束符从新声明回“;”
delimiter // #声明一个新的结束符
create procedure p5(
in arg1 int,
out arg2 char,
inout arg3 int
) #建立一个存储过程
Begin#过程开始执行
select *from t1 where name='tom'; #过程当中的sql语句
select *from t1 where id > arg1; #过程当中的sql语句
insert into t1(name,age) values('Moon',27); #过程当中的sql语句
set arg2 = 'finish';#为out类型的变量从新赋值
set arg3 = 20; #为inout类型的变量从新设置值
end // #过程执行完毕
delimiter ; #把结束符从新声明回来
set @res1='tom'; #建立一个变量
set @res2=10; #建立一个变量
call p2(2,@res1,@res2); #调用存储过程
select @res1; #查询out类型的值被修改成什么了
select @res2; #查询inout类型的值被修改成什么了
Drop procedure 过程名;