MySQL视图、触发器

一、视图

1.什么是视图?
SQL语句的执行结果是一张虚拟表 我们可以基于该表做其他操作
如果这张虚拟表需要频繁使用 那么为了方便可以将虚拟表保存起来 保存起来之后就称之为"视图"(本质就是一张虚拟表)
2.为什么要有视图?
如果要频繁使用一张虚拟表,可以不用重复查询
3.如何使用视图?
正常情况下俩张表连接情况(拼接)查询

select * from userinfo inner join department on userinfo.dep_id = department.id

使用内连接:
	inner join:连接俩表中都存在的数据
	
userinfo(用户表)    department(部门表)

"""
1、在硬盘中,视图只有表结构文件,没有表数据文件(视图数据来源与dep与emp文件,来源于创建的表文件)
2、视图通常是用于查询,尽量不要修改视图中的数据

总结:视图能尽量少用就尽量少用
"""

image

4.反复拼接的繁琐(引入视图的作用)
它的繁琐之处就在于当我们频繁的去查询连表,反复拼接,会出现繁琐的现象,影响效率
5.解决方法
如果要频繁的使用一张虚拟表,可以不用重复查询,而使用视图来进行操作,将拼接的连表保存起来

二、视图的应用

1.创建与删除视图的格式
创建视图:
	create view 创建视图名字 as 执行连表的SQL语句;
删除视图:
	drop view 视图名字;
使用删除视图:
	deop view 视图名字;
'''
注意:
	当字段名相同时时,会产生冲突,导致无法建立视图。
修改字段名:
	alter table <表名> change <字段名> <字段新名称> <字段的类型>;
'''

image

2.查询视图层
select * from depart_user;

image

3.查询navicat视图层位置

image

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

关于视图做了解即可,尽量不要使用,因为在使用的时候它只是拿来看的,并不能修改里面的数据,如果使用者使用了视图去修改数据那么就会报错,可能使使用者不清楚为什么报错造成了混淆,并且视图创建多了的话会占有硬盘空间,但是在navicat中会有表与视图的区分

image

三、触发器

1.什么是触发器?
在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器
2.为何要有触发器?
触发器专门争对我们对某一张表的增insert、删delete、改update的行为,这类行为一旦执行就会触发触发器的执行,即自动运行另外sql语句
3.触发器的触发条件以及语法
针对表数据的增、改、删自动触发的功能(增前、增后、改前、改后、删前、删后)

语法结构:
    create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
    begin
        sql语句
    end
4.触发器名字在命名的时候推荐使用下列的方式(见名知意)
tri_after_insert_t1				tri_before_delete_t1
5.注意事项(临时更换结束符)
在书写sql代码的时候结束符是; 而整个触发器的结束符也是;
这就会出现语法冲突 需要我们临时修改结束符号

临时修改结束符格式:
	delimiter 名字
	
delimiter $$
临时修改sql语句结束符,该语法只在当前窗口有效
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 # 删除之后触发

四、触发器的实战案例

1.创建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
);
----------------------------创建触发器------------------------------
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 ;  # 结束之后记得再改回来,不然后面结束符就都是$$了。
-----------------------------插入数据--------------------------------
#往表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');
2.验证触发器(查询结果)
查询errlog表记录
select * from errlog;

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

image

3.查看触发器
查看触发器:
	show triggers\G;  # 格式化展示
删除触发器:
	drop trigger tri_after_insert_cmd;

image

posted @ 2022-08-19 16:43  张张包~  阅读(79)  评论(0编辑  收藏  举报