1.视图

# 引子
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;

create view temp(emp_id,emp_name,salary,dep_id,dep_id2,dep_name,work) as 
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;

# 全连接形成一张新表, 现有查询是基于全连接这张新表, 如何来操作
# 解决: 将新表其别名full_table, 将需求转换为 select 需求字段 from full_table 条件

什么是视图?

视图是由一张表或者多张表的查询结果构成的一张表,这张虚拟的表的作用就是为了查询。

为什么用视图?

为了将复杂常用的查询结果保留下来重复使用或者将一张大表拆分成多张小表,就是将复杂问题简单化,提升查询的效率。

'''
what: 视图是由一张表或多张表的查询结果构成的一张虚拟表
why: 将复杂常用的查询结果保留下来重复使用 | 将一张大表拆分成多张小表

语法:
create [or replace] view 视图名[(查询字段别名们)] as 查询语句
create view new_emp as (select * from emp);

注:
1.查询字段别名们 要与 查询语句的查询字段对应
2.create or replace: 操作视图没有则创建、有则替换
create or replace view new_emp(id,姓名,工资) as (select id,name,salary from emp where dep_id = 2);

视图的修改:alter 等价于 create or replace, 且语法一致
alter view new_emp(id,姓名,工资) as (select id,name,salary from emp where dep_id = 1);

视图中字段的操作:不允许alter操作字段
alter table new_emp rename new_emp1;
alter view new_emp modify id tinyint;

视图中记录的操作:等价于普通表,完成增删改查
update new_emp set 姓名='san' where id = 3;
delete from new_emp where id = 3;
insert into new_emp(id, 姓名, 工资) values (10, "Bob", 10000); # 操作的是实体表, 虚拟表要重新创建才能拿到最新数据

视图的删除:
drop view 视图名;

总结: 虚拟表作用 -- 查询
'''

2.触发器

什么是触发器?

在表发生数据更新时(update,delete,insert),会自动触发的功能称之为触发器。

为什么用触发器?

当一个表在发生数据更新时,需要去完成一些额外的操作,可以为具体数据更新的方式添加触发器。

'''
what:在表发生数据更新时,会自动触发的功能称之为触发器
why:当一个表在发生数据更新时,需要去完成一些操作,可以为具体数据更新的方式添加触发器

语法:
delimiter //
create trigger 触发器名 before|after insert|update|delete on 表名 for each row
begin 
    需要触发执行的sql代码们
end //
delimiter ;

# 触发器名: t1_before_insert_tri

注:delimiter是用来修改sql的语句结束标识符

删除触发器:drop trigger 触发器名;
'''

# cmd表
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 trigger1 after insert on cmd for each row
begin
# new就是cmd当前插入的那条记录(对象)
if new.success = "no" then
    insert into errlog values(null, new.cmd, new.sub_time);
end if;
end //
delimiter ;

# 往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
insert into cmd(user, priv, cmd, sub_time, success) values
    ('egon', '0765', 'ls -l /etc', now(), 'yes'),
    ('jerry', '0852', 'cat /etc/passwd', now(), 'no'),
    ('kevin', '0867', 'useradd xxx', now(), 'no'),
    ('owen', '0912', 'ps aux', now(), 'yes');
# 查看cmd数据信息
select * from cmd;
# 查看错误日志表中的记录是否有自动插入
select * from errlog;