目录
1.视图
1.视图基本概念
视图就是通过查询得到一张虚拟表(拼表组成的),然后保存下来,方便下次可以直接使用
视图也是表:
在navicat中是视图,
在mysql中查看是一张表,
在实际文件中是.frm文件(表结构)
2制作视图
(1)固定语法
create view 表名 as 虚拟表的查询sql语句
(2)具体例子操作:
create view teacher2course as
select * from teacher INNER JOIN course
on teacher.tid = course.teacher_id;
3.注意:
(1)创建视图在硬盘上只会有表结构 没有表数据(数据还是来自于之前的表)
(2)视图一般只用来查询 里面的数据不要继续修改 可能会影响真正的表
(3)视图使用频率:不高,因为创建了很多视图之后,查询显示太多表会乱
(4)了解即可 基本不用
2.触发器
1.触发器基本概念
功能:在满足对表数据进行增、删、改的情况下,自动触发的功能
用途:使用触发器实现监控、日志...
场景:触发器可以在六种情况下自动触发 增前 增后 删前 删后 改前 改后
2.基本语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名
for each row
begin
sql语句
end
3具体使用: 针对触发器的名字 我们通常需要做到见名知意
例如增
create trigger tri_before_insert_t1 before insert on t1
for each row
begin
sql语句
end
create trigger tri_after_insert_t1 after insert on t1
for each row
begin
sql语句
end
3.注意在使用sql语句时自带分号;,会影响执行,需要将默认分号;执行改为其他符号
修改MySQL默认的语句结束符 只作用于当前窗口
delimiter $$ 将默认的结束符号由;改为$$
delimiter ;
4.案例,记录输入的错误命令
(1)插入两张表
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
);
ps: 当cmd表中的记录succes字段是no
那么就触发触发器的执行去errlog表中插入数据
NEW指代的就是一条条数据对象
(2)设计触发器
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; # if语句
end $$
delimiter ;
(3)朝cmd表插入数据
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('jason','0755','ls -l /etc',NOW(),'yes'),
('jason','0755','cat /etc/passwd',NOW(),'no'),
('jason','0755','useradd xxx',NOW(),'no'),
('jason','0755','ps aux',NOW(),'yes');
# 结果第二第三条语句操作被录入errlog表中
5.删除触发器
drop trigger tri_after_insert_cmd;
3.事务
1.事务基本概念
让执行多条sql语句时保持一致性,即要么同时成功要么同时失败
这就要开启一个事务,这操作也称之为事务的原子性
2.事务的作用(应用)
保证了对数据操作的安全性(两边及以上都完成更改数据,保证都更改)
3.事务的四大特性(ACID)
A:原子性
一个事务是一个不可分割的单位,事务中包含的诸多操作
即:要么同时成功,要么同时失败
C:一致性
事务必须是使数据库从一个一致性的状态变到另外一个一致性的状态(状态的改动)
一致性跟原子性是密切相关的
I:隔离性
一个事务的执行不能被其他事务干扰
即一个事务内部的操作及使用到的数据对并发的其他事务是隔离的,并发执行的事务之间也是互相不干扰的
D:持久性
也叫"永久性"
一个事务一旦提交成功执行成功 那么它对数据库中数据的修改应该是永久的(内存刷到硬盘)
接下来的其他操作或者故障不应该对其有任何的影响
4.事务的用法:
(1)事务相关的关键字
a.开启事务
start transaction;
b.回滚(回到事务执行之前的状态,相当于撤销操作)
rollback;
c.确认(确认之后就无法回滚了)
commit;
5.案例·模拟转账功能
(1)前序造表,存数据
create table user(
id int primary key auto_increment,
name char(16),
balance int
);
insert into user(name,balance) values
('wsx',1000),
('mxg',1000),
('lzr',1000);
(2)对数据处理:
start transaction; # 先开启事务
update user set balance=900 where name='wsx'; # 多条sql语句
update user set balance=1010 where name='msg';
update user set balance=1090 where name='lzr';
rollback; # 回滚到开始事务时
commit; # 确认更改并保存