news 2026/4/15 11:22:29

MySQL进阶篇——视图,存储过程,触发器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL进阶篇——视图,存储过程,触发器

这部分用的比较少,仅作为了解。

1、视图

是虚拟存在的表,视图中的数据并不在数据库中真实存在,自定义查询基表,视图只保存sql逻辑,不保存查询结果。(用于查询)

datagrip数据库出现文件夹views放视图;

--创建视图 create [or replace] view 视图名称 as (select语句); --select语句是数据来源,or replace是如果目标视图已存在就替换,否则新建 create or replace view stu_v_1 as (select id,name from student where id <=10); --查询视图 show create view 视图名称; --查询创建视图的语句 select * from stu_v_1 ...; --查看视图数据:和表的查询一致 --修改视图 create or replace view 视图名称 as (新select语句); --方式1:替换 alter view 视图名称 as (新select语句); --方式2:修改 --删除视图 drop view [if exists] 视图名称;

视图-检查选项

对视图插入数据会同时也插入到基表中,如果插入的数据不符合select语句的where筛选,则基表已插入数据,但视图不会显示这条数据。

--添加检查选项:cascaded(默认值)/local --cascaded create or replace view stu_v_1 as (select id,name from student where id <=10) with cascaded check option; --如果此时插入id=20的数据则会报错,阻止插入违背视图的数据 --cascaded会检查全部级联的视图v2->v1 create view v1 as (select id,name from student where id <=20); create view v2 as (select id,name from v1 where id >=10) with cascaded check option; --若继续创建 create view v3 as (select id,name from v2 where id <=15); insert into v3 values(17,'tom'); --可以插入17,因为v3没有检查,v2和v1会检查 --local仅检查当前及级联中带检查选项的 create view v1 as (select id,name from student where id <=15); create view v2 as (select id,name from v1 where id >=10) with local check option; create view v3 as (select id,name from v2 where id <20); --v3插入数据时仅检查是否>=10

视图的更新规则

视图中的行与基表中的行必须一一对应才能更新,不可更新的情况:

(1)视图中包含聚合函数sum或窗口函数;

(2)视图中包含distinct、group by、having、union/union all;

视图的作用

1、简化操作,可以把经常使用的查询封装成视图;

2、安全,数据库的授权不能精细到表中哪些行和列,视图可以限制;

3、数据独立,屏蔽基表变化的影响;

--视图案例 create or replace view stu_course_view as (select s.name student_name, s.no student_no, c.name course_name from student s left join student_course sc on s.id=sc.studentid left join course c on sc.courseid=c.id) with cascaded check option; select * from stu_course_view;

2、存储过程

存储过程是一组为了完成特定功能的 SQL 语句集,经过预编译后存储在数据库服务器端。它是数据库对象的一种,封装了业务逻辑、控制流程和数据操作(封装与重用)。

特点:封装,复用;可以接收参数,可以返回数据;减少网络交互,效率提升;

datagrip数据库出现文件夹routines放存储过程;

create procedure 存储过程名称([参数列表]) begin --多条sql语句; end; call 名称([参数]); --调用存储过程 --例子 create procedure p1() begin select count(*) from student; end; call p1(); --调用执行其中sql语句 --查看指定数据库中所有存储过程及状态信息 select * from information_schema.ROUTINES where ROUTINE_SCHEMA ='itcast' --查看某个存储过程的定义 show create procedure p1; --删除 drop procedure [if exists] p1;

命令行创建存储过程有;会报错,需要定义结束符号 delimiter $$

create procedure p1() begin select count(*) from student; end$$

改回来时 delomiter ;

变量

(1)系统变量@@:不是用户定义的,服务器层面,分为全局变量global,会话变量session;

show [session|global] variables; --查看所有系统变量 show [session|global] variables like ''; --模糊匹配查看系统变量 select @@[session|global]系统变量名; --查看指定变量的值 select @@autocommit; select @@session.autocommit; --设置系统变量 set [session|global] 系统变量名=值; --哪怕是global服务器重启也会恢复默认值 set @@[session|global].系统变量名=值; set @@global.max_connections = 1000; --不想失效,需要在/etc/mysql/mysql.conf.d/mysqld.cnf中配置

(2)用户定义变量:不用提前声明,@变量名使用,作用范围是当前会话;

set @var_name=expr [,@var_name1=expr1]; --多变量赋值 set @var_name:=expr [,@var_name1:=expr1]; select 字段名 into @var_name from 表名; --表中的查询结果赋值给变量 select @var_name, @var_name1; --使用变量,未赋值输出null

(3)局部变量:局部生效的变量,通过declare声明,可用作存储过程的局部变量/输入参数,范围是begin..end内。

declare 变量名 变量类型 [default]; --变量类型int,char等,default添加默认值 set 变量名=值; --多种赋值语句 set 变量名:=值; select 字段名 into 变量名 from 表名; --查询的结果赋值给变量 create procedure p2() begin declare stu_count int default 0; set stu_count=100; select stu_count; --查询赋值结果 end; call p2();

if条件语句

if 条件1 then... --if语句语法 elseif 条件2 then... else... end if; --例子 create procedure p3() --创建存储过程 begin declare score int default 58; --定义变量 declare result varchar(10); if score >=85 then set result:='优秀'; elseif score >=60 then set result:='及格'; else set result:='不及格'; end if; select result; --展示结果 end; call p3(); --调用存储过程

参数

in 输入参数,调用时传入值(默认);参数赋值也是set;

out 输出参数,作为返回值;

inout 既可以作为输入参数,也可以作为输出参数;

create procedure 存储过程名称([in/out/inout 参数名 参数类型]) begin --多条sql语句; end; --例子1 create procedure p4(in score int,out result varchar(10)) begin if score >=85 then set result:='优秀'; --并不是if每行要加;而是set语句需要有; elseif score >=60 then set result:='及格'; else set result:='不及格'; end if; end; call p4(68,@result); --自定义变量接收 select @result; --例子2 create procedure p5(inout score double) begin set score=score *0.5; end; set @score=78; --自定义变量 call p5(@score); select @score;

case语句

--语法一 case case_value when value1 then state1 when value2 then state2 else state3 end case; --语法二 case when condition1 then state1 when condition2 then state2 else state3 end case; --例子1 create procedure p6(in month int) begin declare result varchar(10); case when month>=1 and month<=3 then set result='第一季度'; when month>=4 and month<=6 then set result='第二季度'; when month>=7 and month<=9 then set result='第三季度'; when month>=10 and month<=12 then set result='第四季度'; else set result='非法参数'; end case; select concat('输入月份为:',month,',所属季度',result); end; call p6(1);

while循环

while 条件 do sql逻辑 --满足条件则执行逻辑 end while; --例子1-n累加值 create procedure p7(in n int) begin declare sum_n int default 0; while n>0 do set sum_n=sum_n+n; set n=n-1; end while; select sum_n; end; call p7(10);

repeat循环(满足条件则退出循环)

loop循环(简单循环,可以实现死循环)

repeat sql逻辑... until 条件 end repeat; --loop [label:]loop sql逻辑 end loop [label]; leave label; --退出指定标记的循环体 iterate label; --直接进入下一次循环体

游标

存储查询结果集的数据类型,可以使用游标对结果集循环处理(局部变量只能存单个值)

声明游标需要在声明变量后

条件处理程序handler:定义流程控制结构执行过程中遇到问题的相应处理步骤

declare 游标名称 cursor for 查询语句; --声明游标 open 游标名称; --打开游标 fetch 游标名称 into 变量 [,变量]; --获取游标记录 close 游标名称; --关闭游标 --条件处理程序 declare handler_action handler for condition_value [,condition_value] statement; --handler_action是continue继续执行/exit终止执行当前程序 --condition_value的值sqlstate value(状态码),sqlwarning(01开头的sqlstate代码简写), --not found(02开头的sqlstate代码简写),sqlexception(除了01和02) --例子 create procedure p8(in uage int) begin declare uname varchar(100); --先声明局部变量再声明游标最后声明handler declare upro varchar(100); declare u1 cursor for (select name,profession from tb_user where age<=uage); --满足sql状态码触发exit行为+关闭游标(not found没数据了/sqlstate '02000'报错信息) declare exit handler for not found close u1; create table if not exists tb_user_pro( id int primary key auto_increment, name varchar(100), profession varchar(100) );--创建新表通过游标存查询出来的数据 open u1; while true do --死循环 fetch u1 into uname,upro; --声明局部变量逐行获取游标的值(fetch自动换行) insert into tb_user_pro values(null,uname,upro); end while; close u1; end; call p8(30);

3、存储函数

存储函数是有返回值的存储过程,参数只能是in类型(默认)(可以被存储过程替代)

create function 存储函数名称([in 参数名 参数类型]) returns 返回值类型 [characteristic] begin --sql语句 return...; --必须有返回值 end; --characteristic要指定:deterministic相同输入参数总是产生同样的结果; --no sql不包含sql语句;reads sql data包含读取数据的语句,不包含写入数据的语句 select fun1(50);

4、触发器

触发器是与表有关的数据库对象,在insert/update/delete之前或之后,触发并自动执行触发器中定义的SQL语句集合,可以用于确保数据完整性,日志记录,数据校验等。

只支持行级触发,使用old和new引用触发器中发生变化的记录内容。

create trigger trigger_name before/after insert/update/deleteon table_name for each row --行级触发器 begin trigger逻辑; end; --创建触发器 show triggers; --查看触发器(当前数据库) drop trigger [schema_name.]trigger_name; --删除触发器,可以指定数据库默认是当前数据库 --例子1:tb_user表数据插入情况记录到user_logs表 create trigger tb_user_insert_trigger after insert on tb_user for each row begin insert into user_logs(id,operation,operate_time,operate_id,operate_params) values(null,'insert',now(),new.id, concat('插入的数据内容id=',new.id,',name=',new.name,',phone='new.phone)) end; --update要同时记录更新前后的数据old.id, old.name, old.phone, new.id, new.name... --update影响几行就触发几次(行级触发器) --delete记录的是old.id, old.name, old.phone
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 14:12:25

万亿参数大模型成本直降80%:Kimi K2如何用MoE架构重塑企业AI应用

导语 【免费下载链接】Kimi-K2-Instruct-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Kimi-K2-Instruct-GGUF 月之暗面发布的Kimi K2大模型以1万亿总参数规模和320亿激活参数的混合专家&#xff08;MoE&#xff09;架构&#xff0c;在保持顶级性能的同时…

作者头像 李华
网站建设 2026/4/12 22:43:07

Obsidian Kanban图片添加终极指南:新手必学的简单技巧

Obsidian Kanban图片添加终极指南&#xff1a;新手必学的简单技巧 【免费下载链接】obsidian-kanban Create markdown-backed Kanban boards in Obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-kanban 想要让Obsidian Kanban看板更加生动直观吗&#…

作者头像 李华
网站建设 2026/4/10 3:45:17

双接口固态硬盘长时间传输大文件会过热掉速吗

在今天的数字化时代&#xff0c;越来越多的人开始使用移动固态硬盘&#xff08;SSD&#xff09;来存储和传输文件&#xff0c;尤其是那些需要频繁处理大文件的用户。无论是视频编辑、图形设计&#xff0c;还是大型数据传输&#xff0c;SSD都以其卓越的速度和高效性能成为了工作…

作者头像 李华
网站建设 2026/4/14 16:34:19

GPT5.2全面解析:从UI设计到文献处理,大模型应用实战指南

本文详细测评了GPT5.2的重大更新&#xff0c;通过与Gemini 3的对比发现&#xff0c;GPT5.2在知识库更新、幻觉减少、理解力等方面表现优异&#xff0c;前端界面复刻能力突出&#xff0c;PPT制作功能进步明显&#xff0c;统计分析能力提升。虽然图片处理仍是短板&#xff0c;但其…

作者头像 李华
网站建设 2026/4/14 9:45:07

HMO奶粉的科学突破与金领冠珍护铂萃的六维超凡喂养力

在婴幼儿营养领域&#xff0c;天然喂养始终被视为“黄金标准”。然而&#xff0c;对于无法实现乳源喂养的家庭而言&#xff0c;如何通过配方奶粉尽可能贴近乳源的营养结构和功能&#xff0c;一直是科研人员和乳企不懈追求的目标。近年来&#xff0c;随着对HMO研究的深入&#x…

作者头像 李华