1.1 视图
根据SQL语句获取动态的数据集,并为其命名 # CREATE VIEW 视图名称 AS SQL语句 # create view t1 as select * from teacher; # 创建的视图有自己的表结构,并且如果对视图的数据进行更改的话,相当于更改本生的表的数据 #更改视图 # 语法:ALTER VIEW 视图名称 AS SQL语句 相当于删掉重建一样 # 删除视图 # 语法:DROP VIEW 视图名称 # DROP VIEW teacher_view # 触发器 # 使用触发器可以定制用户对某一张表的数据进行【增、删、改】操作时的前后,触发对另一张表进行操作 # create trigger 自定义的触发的名称 after/before insert on 操作的表名 for each row # begin # ...... # end # 触发器删除 # drop trigger +触发器的名称 # 示例 # delimiter // # CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW # BEGIN # IF NEW.success = 'no' THEN # INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time); # END IF # END// # NEW表示即将插入的数据行,OLD表示即将删除的数据行
1.2 事务
# 事务的四大特性: # # 1. # # 原子性(Atomicity) # # 事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。 # # 2. # # 一致性(Consistency) # # 事务发生前和发生后,数据的完整性必须保持一致。 # # 3. # # 隔离性(Isolation) # # 当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。 # # 4. # # 持久性(Durability) # # 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过 # # '补偿性事务'。 # 通过一个存储过程对事务进行说明 # delimiter // # create PROCEDURE p5() # BEGIN # DECLARE exit handler for sqlexception # BEGIN # rollback; # END; # # START TRANSACTION;#开启事务 # update user set balance=900 where name='wsb'; #买支付100元 # update user set balance=1010 where name='chao'; #中介拿走10元 # #update user2 set balance=1090 where name='ysb'; #卖家拿到90元 # update user set balance=1090 where name='ysb'; #卖家拿到90元 # COMMIT; #在事务中,对数据进行操作后的数据没有直接写入到硬盘中,通过commit的数据 # 才会将数据保存到硬盘中, # # END // # delimiter ;
1.3存储过程 in /out/inout
# 存储过程(在那个库中建立的 就只能在哪个库中使用) # 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql # 存储过程的优点是:用于替代程序写的SQL语句,实现程序与sql解耦 # 基于网络传输,传别名的数据量小,而直接传sql数据量大 # 无参数的存储过程 # delimiter // # create procedure p1() # begin # select * from s1; # end // # delimiter ; # # 存储过程的调用方法 # call p1() # 在pymysql 中的存储过程的调用方法 # cursor.callproc('p1') # print(cursor.fetchall()) # 有参数的存储过程 # 对于存储过程,可以接收参数,其参数有三类: #in 仅用于传入参数用 #out 仅用于返回值用,就是从储存过程里面传递值出来,而没有传递值进去 #inout 既可以传入又可以当作返回值 # delimiter // # create procedure p2(in g1 int ,out g2 int) # begin # select * from s1 where id >g1; # set g2 = 6; # end // # delimiter ; # 调用方式 # 在mysql上的调用方式 # set @g2 = 0;# 有out类型的数据才会进行声明 # call p2(2,@g2) # select @res; #查看返回的值 # 在pymysql上的调用方式 # cursor.callproc('p2',(3,0))#0相当于set @res=0,在pymysql中,会自动为两个参数生成一个临时的变量 # 第一个参数变量名:@_p2_0=3,第二个:@_p2_1=0 # print(cursor.fetchall()) # cursor.execute('select @_p2_0,@_p2_1;') #@_p3_0代表第一个参数,@_p3_1代表第二个参数,即返回值 # cursor.close() # conn.close() # inout:既可传入又可以返回值: # delimiter // # create procedure p3(inout g3 int) # begin # select * from s1 ; # set g3 = 10; # end // # delimiter ; # 与上面的一样 # set @hh = 5; # call p3(@hh) # select @hh # 存储过程综合实例 #create procedure p4(out code int) #begin # #declare exit handler for sqlexception #异常捕获 #begin #set code = 1 ; #rollback; #end; # # #declare exit handler for sqlwarning #告警捕获 #begin #set code = 2; #rollback; #end; # #start transaction;#事务 #delete from tb1; #insert into s1 value('11','22','33'); #commit; #set code = 0; #end // # delimiter ; # 调用 (注意下面是两条命令) # set @gg = 9; # call p4(@gg);