MYSQL数据库详解(6)-- 视图&存储方式&触发器

发布时间:2024年01月23日

视图

视图是从一个或者几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。

特征:

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语句前后执行,本身不影响原功能。

文章来源:https://blog.csdn.net/ji_xin0721/article/details/135766215
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。