1、视图
视图是一个虚拟表(非真实存在),用户只需要使用[名称]即可获取结果集,可以将结果集当作表来使用。
创建视图:create view course_view as select * from course where id > 2;
使用视图:select * from course_view;(本质上是与select * from course where id > 2;相同)
但是无法修改视图中的记录,而且在涉及多个表的情况下是根本无法修改视图中的记录的
修改视图:alter view course_view as 新的sql语句;
删除视图:drop view course_view
2、触发器
触发器能够对表在进行增、删、改操作的前后进行操作。
创建触发器:
在对表进行插入操作之前进行其他操作。
create trigger tri_before_insert_t1 before insert on t1 for each row
begin
...
end
在对表进行插入操作之后进行其他操作。
create trigger tri_after_insert_t1 after insert on t1 for each row
begin
...
end
触发器无法由用户主动出发,只能在指定的表被增删改之后 被动的触发
删除触发器:drop trigger tri_before_insert_ti;
例子:
# 为例子准备表
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
# 创建触发器
delimiter //
create trigger tri_after_insert_cmd after on insert cmd for each row
begin
IF NEW.success = 'no' THEN
INSERT INTO errolog(err_cmd, err_time) ON VALUES(NEW.cmd, NEW.sub_time); # 必须加分号
END IF
END//
delimiter ;
当网cmd插入记录的时候,success字段为no时,会自动往errlog表中插入记录。
3、事务
同时执行多个任务,一旦一个任务执行失败,则会执行回滚(其他任务皆不会执行成功)
例:
# 创表
create table user(
id int primary key auto_increment,
name char(32),
balance int
);
insert into user(name,balance)
values
('xu',1000),
('songy',1000),
('sy',1000);
start transaction;
pdate user set balance=900 where name='xu';
update user set balance=1010 where name='songy';
uppdate user set balance=1090 where name='sy';
commit;
只有输入执行commit之后,才会对表中数据进行了修改
在执行commit之前,用户可以主动执行回滚,命令为:rollback;
4、存储过程
存储过程包含了一系列的可执行的sql语句,存储过程存放在 MySQL中,通过调用存储过程的名字便可以执行内部的一对sql语句
优点:
1、用于替代程序写的SQL语句,实现程序与sql的节藕
2、基于网络传输,传别名的数据量小,而直接传sql数据量大
缺点:扩展功能不方便
创建存储过程:
1、无参数的存储过程创建
delimiter //
create procedure p1()
begin
select * from user;
insert into user(name,age,sex) values("xxx",18,'男');
end //
delimiter ;
调用存储过程
1、在MySQL中调用:call p1();
2、在Python中调用 cursor.callproc('p1')
print(cursor.fetchall())
2、有参数的存储过程创建
参数有三类:in 仅用于传入参数用;out 仅用于返回值;inout 既可以作为传入参数,也可以作为返回值
delimiter //
create procedure p2(in n1 int, in n2 int, out s)
begin
select * from score where id > n1 and id < n2;
set s = 1;
end //
delimiter ;
调用有参数的存储过程
1、在MySQL中调用:
set @s = 0;
call p2(2,5,@s);
select @s; # 查询@s的值
2、在Python中的调用:
cursor.callproc('p2',(2,5,0)) # 实质上是callproc将参数封装为@_p2_0=2, @_p2_1=5, @_p2_2=0
print(cursor.fetchall()) # 拿到执行的结果
cursor.excute('select @_p2_2')
print(cursor.fetchall()) # 拿到返回的值
3、删除存储过程
drop procedure 存储过程名
ps: 事务、视图、触发器都可以写入存储过程当中
来源:https://www.cnblogs.com/zrxu/p/11834099.html