伤心客 发表于 2024-8-1 06:54:27

数据库(MySQL)-视图、存储过程、触发器

一、视图

视图的定义、作用

           视图是从一个大概几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。但是视图只能用来查看表,不能做增删改查。            视图的作用:①简化查询  ②重写格式化数据  ③频繁访问数据库  ④过滤数据                    创建视图

        语法:create view 视图名【view_xxx/v_xxx】as 查询语句
create view v_stu_man as
SELECT * from student where ssex='男' 使用视图

         语法:SELECT * FROM 视图名
SELECT * FROM v_stu_man 结果:
https://i-blog.csdnimg.cn/direct/3f6b00f30ef041728a71a70af7443ea6.png
 案例1:查看男同学的信息和班级
create view v_stuman_class as
select v_stu_man.*,classname from v_stu_man
left join class on v_stu_man.classid=class.classid 结果: 
https://i-blog.csdnimg.cn/direct/4f0bb0e7a6b64afaaa996e093260b9e5.png
         留意:student 表改变,视图会跟着一起改变
UPDATE student SET sname='赵蕾蕾' WHERE sid=1         表中数据已改:
 https://i-blog.csdnimg.cn/direct/b329293888554d3192aad6f176453c18.png
        查看视图中的信息:
SELECT * FROM v_stu_man          结果:
https://i-blog.csdnimg.cn/direct/ec6062ef2a5e4d85a2fc0ea881233725.png
 查看库中所有视图

SELECT * from information_schema.views
where table_schema='myschool' 结果:
https://i-blog.csdnimg.cn/direct/46f37f2886e2438a82f5a2bff1d4a6f6.png 
删除视图

drop VIEW v_stu_man 二、存储过程

存储过程的定义

           存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数)来执行它。   创建存储过程

语法

CREATE PROCEDURE 存储过程名【proc_xxx】(形参列表)
BEGIN
    一组SQL语句集
END
案例

案例1:创建最简单的存储过程
delimiter $$定订定界符,delimiter ;;恢复默认定界符
delimiter $$
create procedure proc_test()
begin
    select * from student;
end $$
delimiter ;
-- 使用存储过程
CALL proc_test(); 结果:
https://i-blog.csdnimg.cn/direct/cc500556497b4b1f8ca5f4b6eb9f8ad5.png
案例2:创建带参的存储过程 
delimiter $$
create PROCEDURE proc_test2(
    in a int,-- 只入参
    out b int,-- 只出参
    inout c int -- 出入参
)
begin
   set a=a+1;
   set b = b+100;
   set c = c+1000;
end $$
delimiter ;

#设置环境变量:@局部环境变量@@全局环境变量
set @x=10;
set @y = 20;   
set @z = 30;

select @x, @y, @z;

-- 运行结果为图1
-- 使用存储过程
call proc_test2(@x,@y,@z)

select @x, @y, @z;
-- 运行结果为图2 结果1:
https://i-blog.csdnimg.cn/direct/ca0dbb042cf3441295022022f490d57d.png
结果2:
https://i-blog.csdnimg.cn/direct/e42881b727664b3f858428a801d23b28.png 
        为什么使用了存储过程后会得到这样的结果呢?
        由于在我们定义形参a、b、c时,前面给他们加了修饰符:in、out、inout。所以a是只入参数:即只能将参数传入,而不参与运算,所以a为10。b是只出参,即无法给它传入值,所以它为Null。c是收支参,即既可以将参数传入,也可以参与运算输出,所以c为1030。
案例3:使用存储过程到达分页结果
delimiter $$
create procedure proc_stuPage(
    in curpage int,
    in sizepage int,
    -- 学生数
    out stucount int,
    -- 页数
    out pagecount int
)
begin
    #declare:声明局部变量
    declare cp int;
    set cp=(curpage-1)*sizepage;
    -- 把表中的值存入int类型的变量(此表只能有一条数据)
    select count(*) from student into stucount;
    set pagecount=ceiling(stucount / sizepage);
    select * from student limit cp,sizepage;
end $$
delimiter ;
set @a = 0; -- stucount
set @b = 0; -- pagecount
call proc_stuPage(2,3,@a,@b); -- 结果1

-- 查看学生数和页数
select @a,@b -- 结果2 结果1:
https://i-blog.csdnimg.cn/direct/4fc50b7bd9a042ab864408d13d0a8c11.png
结果2:
https://i-blog.csdnimg.cn/direct/9fee1d19b47b45b3a7f65ca514e01980.png 
存储过程与函数的区别

语法:关键字不同,存储过程是procedure, 函数是function;
执行:存储过程可以独立执行,函数必须依赖表达式的调用;
返回值:存储过程可以定义多个返回结果, 函数只有一个返回值;
功能:函数不易做复杂的业务逻辑,但是存储过程可以。
存储过程的缺陷

维护性:存储过程的维护本钱高,修改调试较为贫苦。
移植性:大多数关系型数据库的存储过程存在渺小差别
协作性:没有相干的版本控制大概IDE,团队中对于存储过程的使用大多是依赖文档。
三、触发器

触发器定义

        触发器是数据库中针对数据库表操作触发的 特别的存储过程。
创建触发器

语法

delimiter $$
CREATE TRIGGER 触发器名【trig_xxx】
BEFORE/AFTER -- 执行次序
INSERT/UPDATE/DELETE -- 触发事件
ON 表名
案例

案例1:删除学生 sid 为 1  在此之前把学天生绩删除
-- 创建触发器
delimiter $$
create trigger trig_delstu_delsc
before delete on student for each row
begin
    delete from sc where sid = old.sid;
end $$
delimiter ;

-- 触发事件
DELETE FROM student WHERE sid=1;

-- 查看学生表
select * from student;
-- 查看成绩表
select * from sc; 学生表结果:
 https://i-blog.csdnimg.cn/direct/8d5abc6d923e4285801fb80b674865b8.png
成绩表结果:
 https://i-blog.csdnimg.cn/direct/40119eb1ea634003bbf2f48e561a1e9f.png
查看所有触发器

SELECT * FROM information_schema.`TRIGGERS`
WHERE trigger_schema = 'myschool' 结果:
https://i-blog.csdnimg.cn/direct/e05c7acb67034f92bfc67300af552e94.png 
删除触发器 

DROP TRIGGER trig_delstu_delsc 删除后查看所有触发器:
https://i-blog.csdnimg.cn/direct/d37bbca50e3b43a2afea05d90ef71aa1.png 
存储过程和触发器的区别

语法:关键字不同,存储 过程是procedure, 触发器是trigger
执行:存储过程需要调用才执 行,触发器自动执行
返回值:存储过程可以定义返回值, 但是触发器没有返回值;
功能:存储过程是一组特定功能的 SQL语句,触发器则是SQL语 句前后执行,本身不影响原功 能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 数据库(MySQL)-视图、存储过程、触发器