MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化

视图

1.什么是视图?
视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用
2.为什么要使用视图?
如果要频繁使用一张虚拟表,可以不用重复查询
3.如何使用视图?
create view 表1_表2 as
select * from 表1 inner join 表2 on 条件;
例:
    create view teacher_course as
    select * from teacher inner join course on teacher.tid = course.teacher_id;

 

强调:
1.在硬盘中,视图只有表结构文件,没有表数据文件
2.视图通常是用于查询,尽量不要修改视图中的数据

 



思考:开发过程中会不会使用视图?
不会!视图是mysql的功能,如果你的项目里面大量使用到了视图,那意味着你后期向要扩张某个功能的时候这个功能恰巧又需要对视图进行修改,意味着你需要先在mysql这边将视图先修改一下,
然后再去应用程序中修改对应的sql语句,这就涉及到跨部门沟通的问题,所以通常不会使用视图,而是通过重新修改sql语句来扩展功能

触发器

在满足对某张表数据 增删改 的情况下,自动触发的功能称之为触发器(一种监测机制)
1.为何要用触发器
触发器专门针对我们对某一张表数据 增insert,删delete,改update 的行为,着类行为一旦执行,就会触发触发器的执行,即自动运行另外一段sql代码

创建触发器语法:
# 针对增 create trigger tri_after_insert_ti after insert on 表名 for each row begin sql代码... end create trigger tri_before_insert_ti before insert on 表名 for each row begin sql代码... end ​ # 针对删 create trigger tri_after_delete_t1 after delete on 表名 for each row begin sql代码。。。 end create trigger tri_after_delete_t2 before delete on 表名 for each row begin sql代码。。。 end ​ # 针对改 create trigger tri_after_update_t1 after update on 表名 for each row begin sql代码。。。 end create trigger tri_after_update_t2 before update on 表名 for each row begin sql代码。。。 end ​

 

# 案例
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 $$  # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
    if NEW.success = 'no' then  # 新记录都会被MySQL封装成NEW对象
        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
    ('egon','0755','ls -l /etc',NOW(),'yes'),
    ('egon','0755','cat /etc/passwd',NOW(),'no'),
    ('egon','0755','useradd xxx',NOW(),'no'),
    ('egon','0755','ps aux',NOW(),'yes');
​
# 查询errlog表记录
select * from errlog;
# 删除触发器
drop trigger tri_after_insert_cmd;

 

事务

1.什么是事务
开启一个事务可以包含一堆sql语句,这些sql语句要么都成功,要么一个也别想成功
2.事务作用
保证了对数据操作的数据安全性
案例:用交行的卡在农行ATM机上给工行账户转账
3.事务的四大特性
原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包含的诸多操作要么都成功,要么都不成功
一致性(consistency):事务必须是使数据从一个一致状态变到另一个一致状态,一致性与原子性是密切相关的
隔离性(isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并执行的个事务之间不能互相干扰
持久性(durability):持久性也成永久性(permanence),指一个事务一旦提交,他对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响
事务的使用
# 创建一张表
create table user(
id int primary key auto_increment,
name char(32),
balance int
);
# 插入数据
insert into user(name,balance)
values
('wsb',1000
  • 4
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值