视图
视图就是一个虚拟的表
create view 视图名 select * from 数据库;
触发器
使用触发器可以定制用户对表进行增、删、改操作的前后行为。
- 创建触发器
# 插入前
create trigger tri_before_insert_tb1 before insert on tb1 for each row
BEGIN
...
END
# 插入后
create trigger tri_after_insert_tb1 after insert on tb1 for each row
BEGIN
...
END
# 删除前
create trigger tri_before_delete_tb1 before delete on tb1 for each row
BEGIN
...
END
# 删除后
create trigger tri_after_delete_tb1 after delete on tb1 for each row
BEGIN
...
END
# 更新前
create trigger tri_before_update_tb1 before update on tb1 for each row
BEGIN
...
END
# 更新后
create trigger tri_after_update_tb1 after update on tb1 for each row
BEGIN
...
END
# 删除触发器
如: drop trigger tri_after_insert_cmd;
示例
create table cmd(
id int primary key auto_increment,
user varchar(32),
priv varchar(10),
cmd varchar(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 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//
delimiter ;
# 往cmd表中插入记录,触发触发器,根据IF的结果决定是否插入错误日志
insert into cmd(user, priv, cmd, sub_time, success) values('nihao', '1111', 'ls -alh', NOW(), 'yes');
# 查询错误日志
select * from errlog;
存储过程
存储过程包含了一系列可执行的sql语句,存储过程存放在MySQL中,通过调用它的名字可以执行其内部的sql。
- 优点
- 用于替代程序员写的sql语句,实现程序与sql解耦。
- 基于网络传输,传别名的数据量小,而直接传sql数据量大。
- 缺点
- 程序员想要扩展功能不便利
创建无参的存储过程
delimiter //
create procedure 存储过程名()
BEGIN
select * from class;
END //
delimiter ;
# 查看创建的存储过程
show create procedure 存储过程名;
# 存储过程的调用
## mysql中
call 存储过程名();
## Pythonz中
cursor.callproc('存储过程名')
创建无参的存储过程
delimiter //
create procedure 存储过程名(in n1 int, in n2 int, out ret int)
BEGIN
select * from teacher where tid > n1 and tid < n2;
set ret=1;
END //
delimiter ;
# 存储过程的调用
## mysql中
set @x;
call 存储过程名(1, 3, @x);
select @x;
## Python中
cursor.callproc('存储过程名', (1, 3, 0))
cursor.execute('select @_存储过程名_2;')
cursor.fetchone()
事务
事务用于将某些操作的多条SQL作为原子性操作,一旦有某个出现错误,即可回滚到原来的状态,从而保证数据库中数据的完整性。
create table user(
id int primary key auto_increment,
name varchar(32),
balance int
);
insert into user(name, balance) values('xxx', 1000), ('yyy', 1000);
# 开启事务
start transaction;
update user set balance=900 where name='xxx';
update user set balance=800 where name='xxx';
commit;
# 出现异常就回滚到初始状态
start transaction;
update user set balance=900 where name='xxx';
update user set balance=800 where name='xxx';
rollback;
commit;
函数
内置函数请百度。
自定义函数
delimiter //
create function f1(
i1 int,
i2 int)
returns int
BEGIN
declare num int;
set num = i1 + i2;
return(num);
END //
delimiter ;
delimiter //
create function f(
i int
)
returns int
begin
declare ret int default 0;
if i = 10 then
set ret = 100;
elseif i=20 then
set ret = 200;
elseif i=30 then
set ret = 300;
else
set ret = 400;
end if;
return ret;
end //
delimiter ;
删除函数
drop function func_name;
执行函数
# 获取返回值
select upper('xxx') into @res;
select @res;
# 查询中使用
select f1(i1, nid), name from tb2;