MySQL视图-触发器

一:视图

1.什么是视图?

视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可。

2.为什么要用视图?

如果要频繁使用一张虚拟表,可以不用重复查询。

3.如何使用视图
正常两张表连接情况(拼接)查询
select * from emp inner join dep on emp.id=dep.id; 

使用内连接:
	inner join	: 连接两表中都存在(对应关系)的数据
	
dep	: 部门表		emp : 员工详细表
4.反复拼接的繁琐(引入视图的作用)
反复拼接繁琐之处:
当我们频繁的去查询连表,反复拼接,会出现繁琐的现象,影响效率。

5.解决方法
如果要频繁使用一张虚拟表,可以不用重复查询,而使用视图来进行操作,将拼接的连表保存起来。

二:视图的应用

1.创建视图的格式:
create view 创建视图名字 as 执行连表的SQL语句

image

注意:
当字段名相同时时,会产生冲突,导致无法建立视图。
修改字段名:
alter table <表名> change <字段名> <字段新名称> <字段的类型>;
2.查询视图层
select * from shi_tu;

image

3.查询Navicat视图层位置

image

4.删除视图表
删除视图表格式:
	drop view 视图名;
使用删除视图:
	deop view shi_tu;
5.使用视图须知注意事项(强调)
1.在硬盘中,视图只有表结构文件,没有表数据文件(视图数据来源与dep与emp文件,来源于创建的表文件)
2.视图通常是用于查询,尽量不要修改视图中的数据(改视图会影响到原表)

image

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

三:触发器

1.什么时触发器?
在满足对某张表数据的增,删,改的情况下,自动触发的功能称之为触发器
2.为何要用触发器?
触发器专门针对我们对某一张表的增insert,删delete,改update的行为,这类行为一旦执行
就会触发触发器的执行,既自动运行另外一段sql语句。
3.触发器trigger
触发器:满足特点条件之后自动执行
在MySQL只有三种情况下可以触发
	1.针对表的增
    	增前 增后
    2.针对表的改
    	改前 改后
    3.针对表的删
    	删前 删后
4.触发器语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
	sql语句
end
5.触发器名字在命名的时候推荐使用下列的方式(见名知意)
tri_after_insert_t1				tri_before_delete_t1
6.触发器三种状态(六种演示)
增加:
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
	 sql语句
end	 # 增加之后触发

create trigger tri_before_insert_t1 before insert 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_before_insert_t1 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_before_delete_t1 defore delete on 表名 for each row

begin
	sql语句
end # 删除之后触发
7.注意事项(临时更换结束符)
需要注意 在书写sql代码的时候结束符是; 而整个触发器的结束符也是;
这就会出现语法冲突 需要我们临时修改结束符号

临时修改结束符格式:
	delimiter 名字
	
delimiter $$
临时修改sql语句结束符,该语法只在当前窗口有效

image

四:触发器实战案例

1.1.MySQL中NEW作用
在MySQL中NEW特指数据对象可以通过点的方式获取字段对应的数据
	id    name	pwd  hobby
	1     jason  123  read
	NEW.name  >>>  jason
2.创建cmd命令表与报错日志
# 模拟cmd命令表
CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),     # cmd命令字段
    sub_time datetime, # 提交时间
    success enum ('yes', 'no') #0代表执行失败
);

# 报错日志表
CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);
3.创建触发器
1.创建之前修改结束符
delimiter $$  # 将mysql默认的结束符由;换成$$
# 创建触发器
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
	# 触发器启动 判断cmd中success字段内容记录是否为no,为no则执行以下代码
    if NEW.success = 'no' then  # 新记录都会被MySQL封装成NEW对象
        insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
end $$
2.创建之后修改结束符
delimiter ;  # 结束之后记得再改回来,不然后面结束符就都是$$了。
4.cmd表内插入记录(数据)
#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    ('tony','0755','ls -l /etc',NOW(),'yes'),
    ('tony','0755','cat /etc/passwd',NOW(),'no'),
    ('tony','0755','useradd xxx',NOW(),'no'),
    ('tony','0755','ps aux',NOW(),'yes');
5.验证触发器(查询结果)
查询errlog表记录
select * from errlog;

解析:
	1.当cmd命令行后台被插入数据时,if判断出现为‘on’ 报错的数据时
	2.会自动触发 触发器会执行代码,将为‘on’错误代码 插入到《errlog报错日志》

image

6.查看触发器
show triggers\G;  # 格式化展示

image

7.删除触发器
drop trigger tri_after_insert_cmd;
posted @ 2022-02-04 00:45  AlexEvans  阅读(194)  评论(0编辑  收藏  举报