MySQL基础(二)
一、视图
视图是一个虚拟表(非真实存在),其本质是:根据SQL语句获取动态的数据集,并为其命名。用户使用时只需使用“名称”即可获取结果集,并可以将其当作表来使用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
select * from (select student_id,num from score where course_id=3)as A where A.num > 60
1、创建视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 语法: -- create view 视图名称 sql语句 create view V1 AS select student_id,num from score where course_id=3
2、删除视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 语法: -- frop view 视图名称 drop view v1
3、修改视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 语法: -- alter view 视图名称 as sql语句 alter view v1 as select student_id,num from score where course_id=1
4、使用视图
使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
select * from v1
二、触发器
对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。
1、创建基本语法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 插入前: create trigger 触发器名称 before insert on 表名 for each row begin ... end -- 插入后: create trigger 触发器名称 after insert on 表名 for each row begin ... end -- 删除前: create trigger 触发器名称 before delete on 表名 for each row begin ... end -- 删除后: create trigger 触发器名称 after delete on 表名 for each row begin ... end -- 更新前: create trigger 触发器名称 before update on 表名 for each row begin ... end -- 更新后: create trigger 触发器名称 after update on 表名 for each row begin ... end
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // create trigger tri_be_ins_t1 before insert on teacher for each row begin insert into class(caption) values('三年一班'); end // delimiter ;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // create trigger tri_be_ins_t2 after insert on teacher for each row begin insert into class(caption) values('一年三班'); end // delimiter ;
特别的:new表示即将插入的数据行,
old表示即将删除的数据行。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- new: delimiter // create trigger tri_be_ins_t3 after insert on student for each row begin insert into teacher(tname) values(new.sname); end // delimiter ; -- insert into student(gender,class_id,sname) values('女',3,'友友') 此时,new.sname = '友友' new.列名 取即将插入的数据行对应的内容 -- old: delimiter // create trigger tri_be_del_t2 before delete on student for each row begin insert into teacher(tname) values(old.sname); end // delimiter ; -- delete from student where sid=19 此时,old.sname = '小三' old.列名 取即将删除的数据行对应的内容
2、删除触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 语法: -- drop trigger 触发器名 drop trigger tri_be_del_t2
3、使用触发器
触发器无法由用户直接调用,只有对表的【增/删/改】操作时,被动引发。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
drop trigger tri_be_del_t2
三、存储过程
存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。
1、创建存储过程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 创建存储过程 delimiter // create procedure p1() begin select * from teacher; end // delimiter ; -- 调用存储过程 call p1()
对于存储过程,可以接收参数,其参数有三类:
- in 仅用于传入参数用;
- out 仅用于返回值用(伪造的返回值);
- inout 既可以传入参数又可以当作返回值(伪造的返回值)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 创建存储过程: delimiter // create procedure p2( in t1 int, out t2 int, inout t3 int ) begin declare temp1 int; declare temp2 int default 2; set temp1=1; set t2=t1+t3+temp1+temp2; set t3 = t3 + 10; end // delimiter ; -- 调用存储过程: set @s1=0; set @s2=2; call p2(1,@s1,@s2); select @s1,@s2;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
delimiter // create procedure p3() begin select * from teacher; end // delimiter ; -- 执行存储过程,里面的SQL语句,有查询结果,返回对应的结果集
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-- 创建存储过程: delimiter // create procedure p4( in t1 int, out t2 int, inout t3 int ) begin select * from teacher where tid < t1; set t2 = t3 + t1 ; set t3 = 99; end // delimiter ; -- 调用存储过程: set @s1=0; set @s2=3; call p4(7,@s1,@s2); select @s1,@s2;