MYSQL数据库详解(6)
- 视图
- 特征:
- 作用:
- 创建视图
- 使用视图
- 删除视图
- 存储过程 ***
- 为什么使用存储过程
- 定义:
- 存储过程和函数的区别
- 缺陷:
- 创建存储过程
- 使用存储过程
- 环境变量 @ 局部环境变量 @@ 全局环境变量
- 删除存储过程
- 分页-- 存储过程分页 (**记住)
- 触发器
- 定义:
- 语法:
- 删除学生 (案例)
- 存储过程和触发器的区别
视图
视图是从一个或者几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。
特征:
1.视图不能做增删改,只能用来查询
2.使用的时候每次都会获取到最新的数据
3.不允许有重复的字段名
4.视图兼容性差,不能和数据库一起转储
作用:
1.简化查询
2.重写格式化数据
3.频繁访问数据库
4.过滤数据
创建视图
create view 视图名【view_xxx\v_xxx】 as 查询语句
create view v_stu_man as select * from student where ssex = '男';
使用视图
select * from v_stu_man;
删除视图
drop view v_stu_man
存储过程 ***
特征:
1.是一种特殊的函数
2.可以有多个返回结果
为什么使用存储过程
1.业务流程复杂:业务复杂时,SQL语句相互依赖,顺序执行;
2.频繁访问数据库:每条SQL语句都需单独连接和访问数据库;
3.先编译后执行:SQL语句的执行需要先编译。
定义:
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程和函数的区别
缺陷:
1.移植性:大多数关系型数据库的存储过程存在细微差异。
2.维护性:存储过程的维护成本高,修改调试较为麻烦。
3.协作性:没有相关的版本控制或者IDE,团队中对于存储过程的使用大多是依赖文档。
创建存储过程
CREATE PROCEDURE 存储过程名【proc_xxx】 (形参列表)
BEGIN
DECLARE 变量 变量类型
END
1.创建一个最简单的存储过程
delimiter $$ -- 定制定界符
create procedure proc_stu()
begin
select * from student;
end $$
delimiter ; -- 恢复默认定界符
使用存储过程
call proc_stu();
2.带参的存储过程
delimiter $$
create procedure proc_test(
in x int, -- in 只入参
out y int, -- out 只出参
inout z int -- inout 出入参
)
begin
set x = x+1;
set y = y+100;
set z = z+1000;
end $$
delimiter ;
环境变量 @ 局部环境变量 @@ 全局环境变量
set @a = 1; -- 2
set @b = 2; -- 102 2
set @c = 3; -- 1003* 3
call proc_test(@a,@b,@c);
删除存储过程
drop procedure proc_test;
分页-- 存储过程分页 (**记住)
delimiter $$
create procedure proc_stupage(
in curpage int,
in sizepage int,
out sumcount int,
out sumpage int
)
begin
DECLARE cp int; -- 定义变量
set cp = (curpage - 1)*sizepage;
-- 总个数
-- into一个数据付给变量
select count(*) from student into sumcount;
-- 总页数
set sumpage = ceiling(sumcount/sizepage);
select * from student limit cp,sizepage;
end $$
delimiter ;
set @a = 2;
set @b = 3;
set @m = 0;
set @n = 0;
call proc_stupage(@a,@b,@m,@n);
select @m,@n;
触发器
定义:
触发器是数据库中针对数据库表操作触发的特殊的存储过程
特征: 隐式执行
语法:
CREATE TRIGGER 触发器名【trig_xxx】
BEFORE/AFTER – 触发顺序
INSERT/UPDATE/DELETE – 触发事件
ON 数据库.表名 – 事件表
FOR EACH ROW
BEGIN
触发器内容 – 事件出发后要写的语句
END$$
删除学生 (案例)
delete from student where sid = 2;
select * from student;
select * from sc;
delimiter $$
create trigger trig_delstu_delsc
before delete on student for each row
BEGIN
-- old 已经存在的数据 new 还不存在
delete from sc where sid = old.sid;
END $$
delimiter ;
存储过程和触发器的区别
1.语法:关键字不同,存储过程是procedure,触发器是trigger;
2.执行:存储过程需要调用才执行,触发器自动执行;
3.返回值:存储过程可以定义返回值,但是触发器没有返回值;
4.功能:存储过程是一组特定功能的SQL语句,触发器则是SQL语句前后执行,本身不影响原功能。