1.视图
视图:通过查询得到一张虚拟表然后保存下来,可以下次使用,制作视图的也是表。
如果要频繁的操作一张虚拟表,就可以制作视图,后续操作视图。
1.1制作视图
create view 视图名 as ( 虚拟表的查询sql语句 ) ;
返回结果 OK
select * from course inner join teacher on course. teacher_id = teacher. tid;
create view t1 as select * from course inner join teacher on course. teacher_id = teacher. tid;
select * from t2;
1.2注意点
1. 创建的视图在硬盘上只会有表结构,没有数据,数据还是需要之前的表。
2. 视图通常只是用来查询里面的数据,不要进行修改可能会影响真正的表。
3. 视图的属于频率不高,创建一个视图就生产一张表,数据库中表太多了不方便维护。
2.触发器
在满足对表数据进行增删改的情况下自动触发的功能。
使用触发器可以实现监、日志、自动处理异常等等。
触发器可以在 6 种情况下自动触发。
增前 / 增后 before insert / after insert
删前 / 删后 before update / after update
改前 / 改后 before dalete / after dalete
2.1创建触发器
语法:
create terigger 触发器名称 before/ after insert / update / dalete on 表名字
for each row begin
sql 语句;
end ;
注意点 :
1. 触发器的名称 见名知意。
2. sql语句和end 需要加上结束符号,需要对默认结束符进行修改。
2.2删除触发器
drop trigger 触发器名称 ;
3.修改默认结束符
默认是结束符为分号 ;
delimiter xx符号
设置xx符号为结束符只作用于当前窗口临时有效。
delimiter $$
delimiter ;
select * from tenchar;
select * from tenchar$$
4.触发器案例
要求 : 在cmd表中的记录succer字段是no那么就触发 触发器的执行去errlog表中插入数据。
create table cmd(
id int primary key auto_increment ,
user char ( 32 ) ,
cmd char ( 64 ) ,
sub_time datetime ,
success enum ( 'yes' , 'no' )
) ;
create table errlog(
id int primary key auto_increment ,
err_cmd char ( 64 ) ,
err_time datetime
) ;
在写这个触发器线将默认结束符号修改。
delimiter $$
create trigger bad_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 ;
delimiter ; # 一定要有空格不要写成delimiter ;
if 条件 then 执行的语句
当if条件满足 , 执行then后面的sql语句
insert into cmd( user , cmd, sub_time, success)
values
( 'kid0' , 'ls -l /x0' , NOW ( ) , 'yes' ) ,
( 'kid1' , 'ls -l /x1' , NOW ( ) , 'no' ) ,
( 'kid2' , 'ls -l /x2' , NOW ( ) , 'no' ) ,
( 'kid3' , 'ls -l /x3' , NOW ( ) , 'yes' ) ;
select * from errlog;
select * from errlog ;
+ ---- + ----------- + --------------------- +
| id | err_cmd | err_time |
+ ---- + ----------- + --------------------- +
| 1 | ls -l / x1 | 2021 - 08 - 01 14 : 02 : 37 |
| 2 | ls -l / x2 | 2021 - 08 - 01 14 : 02 : 37 |
+ ---- + ----------- + --------------------- +
5.事务
5.1四大特性
事务的四大特性: ( ACID )
A . 原子性:一个事务是一个不可分割的单位,事务中包好的诸多操作要么同时成功要么同时失败。
B . 一致性:事务必须是使数据从一个一致性的状态变到另一个一致性的状态。
一致性跟原子性是密切相关的。
I . 隔离性:一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用到的数据对并发的其他事务是隔离的,并发的事务之间也是互相比干扰的。
D . 持久性:也叫永久性,一个事务一旦提交成功,那么对数据库在家哦你的数据修改是永远的接下来的其他操作或者或者故障不应该对其他有任何的影响。
5.1原子性作用
开启一个实物可以包含多条sql语句,这些sql语句要么同时成功,要么一个别想成功。
例子:
银行转账 A -- > B 100 元。
1. A银行卡数据- 100
2. B银行卡数据 + 100
在A转账时,数据- 100 ,正好软件故障,B银行卡数据没有 + 100 。
在操作多条数据的时候可能会出现某几条不成功的情况。将这几天数据放进一个事务内,要么都成功,要门都不成功。保证数据的一致性保证安全。
5.2事务的关键字
事务的关键字
1. 开启事务
start transaction ;
2. 回滚 : 回到事务执行之前的状态。
rollback ;
3. 二次确认(确认之后,无法回滚)
commit ;
5.3模拟转账功能
想让多条sql语句保持一致性要么同时成功,要么同时失败就需要考虑使用事务。
1.用户表
create table user (
id int primary key auto_increment ,
name varchar ( 16 ) ,
balance int
) ;
2.插入数据
insert into user ( name, balance)
values ( 'kid' , 1000 ) , ( 'qz' , 1000 ) , ( 'qq' , 100 ) ;
3.查看数据
select * from user ;
+ ---- + ------ + --------- +
| id | name | balance |
+ ---- + ------ + --------- +
| 1 | kid | 1000 |
| 2 | qz | 1000 |
| 3 | qq | 1000 |
+ ---- + ------ + --------- +
4.开启事务
start transaction ;
5.修改数据
update user set balance = 900 where name = 'kid' ;
update user set balance = 1090 where name = 'qz' ;
update user set balance = 1010 where name = 'qq' ;
6.查看数据
select * from user ;
+ ---- + ------ + --------- +
| id | name | balance |
+ ---- + ------ + --------- +
| 1 | kid | 900 |
| 2 | qz | 1090 |
| 3 | qq | 1010 |
+ ---- + ------ + --------- +
7.回滚操作
数据此时在内存 , 还没有写入硬盘中。
rollback ;
8. 查看数据
mysql > select * from user ;
+ ---- + ------ + --------- +
| id | name | balance |
+ ---- + ------ + --------- +
| 1 | kid | 1000 |
| 2 | qz | 1000 |
| 3 | qq | 1000 |
9.再次修改数据
update user set balance = 900 where name = 'kid' ;
update user set balance = 1090 where name = 'qz' ;
update user set balance = 1010 where name = 'qq' ;
10.查看数据
select * from user ;
+ ---- + ------ + --------- +
| id | name | balance |
+ ---- + ------ + --------- +
| 1 | kid | 900 |
| 2 | qz | 1090 |
| 3 | qq | 1010 |
+ ---- + ------ + --------- +
11.二次确认
commit ;
12.回滚操作
rollback ;
13.查看数据
select * from user ;
+ ---- + ------ + --------- +
| id | name | balance |
+ ---- + ------ + --------- +
| 1 | kid | 900 |
| 2 | qz | 1090 |
| 3 | qq | 1010 |
+ ---- + ------ + --------- +