mysql:视图,触发器
一视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL 语句获取动态的数据集,并未其命名】,用户使用时只需使用名称即可获取结果集,可以将该结果集当做表来使用。
使用视图我们可以吧查询过程的临时表摘出来, 用视图去实现, 这样以后再想操作该临时表的数据时就无需重写复杂的sql了, 直接去视图中查找即可, 但视图有明显的效率问题, 并且视图是存放咋数据库中的, 如果我们程序中使用的SQL过分一开数据库中的视图, 即强耦合 ,那就意味着sql 极为不便, 因此并不推荐使用
1.1:创建视图
语法:create view 视图 as sql 语句
例如:create view teacher_view as select tid from teacher where tname=‘李平老师’; 于是查询李平老师教授的课程名sql 可以改写为 select cname from course where teacher_id =(select tid from teacher_view);
+--------+ | cname | +--------+ | 物理 | | 美术 | +--------+ 2 rows in set (0.00 sec) #!!!注意注意注意: #1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高 #2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
1.2:使用视图
修改视图,原始表也跟着改 select * from Course +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 物理 | 2 | | 3 | 体育 | 3 | | 4 | 美术 | 2 | +-----+--------+------------+ 4 rows in set (0.00 sec) mysql> create view course_view as select * from course; #创建表course的视图 Query OK, 0 rows affected (0.52 sec) select * from course_view; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 物理 | 2 | | 3 | 体育 | 3 | | 4 | 美术 | 2 | +-----+--------+------------+ 4 rows in set (0.00 sec) update course_view set cname='xxx'; Query OK, 4 rows affected (0.04 sec) Rows matched: 4 Changed: 4 Warnings: 0 insert into course_view values(5,'yyy',2) Query OK, 1 row affected (0.03 sec) select * from course; +-----+-------+------------+ | cid | cname | teacher_id | +-----+-------+------------+ | 1 | xxx | 1 | | 2 | xxx | 2 | | 3 | xxx | 3 | | 4 | xxx | 2 | | 5 | yyy | 2 | +-----+-------+------------+ 5 rows in set (0.00 sec)
1.3:修改视图
语法: alter view 视图名称 as sql语句 alter view teacher_view as select * from course where cid>3; Query OK, 0 rows affected (0.04 sec) mysql> select * from teacher_view; +-----+-------+------------+ | cid | cname | teacher_id | +-----+-------+------------+ | 4 | xxx | 2 | | 5 | yyy | 2 | +-----+-------+------------+ 2 rows in set (0.00 sec)
1.4: 删除视图
语法:drop view 视图名
DROP VIEW teacher_view
总结:
1:可以不用重复查询, 提升效率
2: 在硬盘中视图只有表结构文件 没有表数据文件
3:视图通常 用于查询吗尽量不要修改视图中的数据
二、触发器
定义:在满足对魔杖表数据的增、删、改的情况下, 自动触发的功能称之为触发器
触发器专门针对我们队某一张表数据增 insert、删delete,改update的行为, 这类行为一旦执行就会触发触发器的执行, 即自动运行另外一段sql代码
2.1: 创建触发器语法
针对插入
create trigger tri_after_insert_t1 after inser on 表名 for each row begin sql代码 end create trigger tri_before_insert_t2 before insert on 表名 for each row begin sql 代码 end
针对删除
creat trigger tri_after_insert_t2 after delete on 表名 for each row begin sql 代码 end creat trigger tri_before_insert_t2 before delete on 表名 for each row begin sql 代码 end
针对修改
create triggertri_after_update_t1 after update on 表名 for each row begin sql代码 end creat trigger tri_before_insert_t2 before insert on 表名 for each row begin sql 代码 end
2.2:案例
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'); create table errlog( id int primary key auto_increment, err_cmd char(64), err_time datetime); 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,errp_time)values(NEW.cmd.NEW.sub_time); end if; end $$ delimiter;