当前位置: 首页 > news >正文

存储过程详解:把SQL逻辑“打包”存起来,下次一键调用!|转行学DB第12天

不用每次都重复写复杂操作,数据库也能“写脚本”

大家好呀!我是数据库小学妹👋

前几篇我们学会了视图,可以把复杂的查询存成虚拟表。但如果我们遇到这种情况如何解决:

如果我想执行一连串的操作(比如先更新A表,再插入B表,再删除C表),每次都要写好几条SQL。有没有办法把这一整套动作“打包”存起来,下次直接调用?

当然有!今天我就把自己学会的存储过程分享出来——它就像给数据库写“脚本”,把一堆SQL语句封装成一个整体,以后一句命令就能执行全部。


一、什么是存储过程?数据库里的“脚本文件”

存储过程是一段预先编译好并存储在数据库中的SQL代码。你可以给它起个名字,然后像调用函数一样执行它。

💡 类比:你在设计软件里录了一个“动作”宏,一键完成多步操作。存储过程就是数据库的“宏”。

为什么需要它?

  • 复用性:写一次,调用无数次
  • 减少网络传输:只需要发一条CALL命令,而不是几十行SQL
  • 逻辑封装:把复杂的业务逻辑藏在存储过程里,应用层调用更简单

二、什么是存储过程?

📚基本语法

DELIMITER//CREATEPROCEDURE过程名()BEGIN-- 这里写SQL语句SELECT'Hello, Database!';END//DELIMITER;
  • DELIMITER //是改变MySQL的语句结束符(因为过程体里可能有分号),执行完再改回;
  • BEGIN...END之间放你要执行的SQL

调用存储过程

CALL过程名();

🎯实战:无参存储过程示例

创建一个向日志表插入当前时间的存储过程:

DELIMITER//CREATEPROCEDUREInsertLog()BEGININSERTINTOlogs(message,created_at)VALUES('存储过程被执行了',NOW());END//DELIMITER;

调用:

CALLInsertLog();

每次调用,logs表里就会多一行记录。


三、存储过程的参数类型

参数可以让存储过程处理不同的数据。参数有三种类型:

示例1:IN参数——根据用户ID查询姓名

DELIMITER//CREATEPROCEDUREGetUserName(INuser_idINT)BEGINSELECTnameFROMusersWHEREid=user_id;END//DELIMITER;

调用:

CALLGetUserName(1);

示例2:OUT参数——统计用户数量并返回

DELIMITER//CREATEPROCEDUREGetUserCount(OUTtotalINT)BEGINSELECTCOUNT(*)INTOtotalFROMusers;END//DELIMITER;

调用:

CALLGetUserCount(@count);SELECT@count;-- 查看输出参数的值

示例3:INOUT参数——对传入值做运算

DELIMITER//CREATEPROCEDUREDoubleNumber(INOUTnumINT)BEGINSETnum=num*2;END//DELIMITER;

调用:

SET@a=5;CALLDoubleNumber(@a);SELECT@a;-- 结果是 10

四、存储过程的控制结构

在存储过程内部可以定义变量、使用条件判断和循环语句。

🎯定义变量

DECLARE变量名 数据类型[DEFAULT默认值];

🎯IF-ELSE判断示例:根据分数返回等级

DELIMITER//CREATEPROCEDUREGetGrade(INscoreINT,OUTgradeVARCHAR(10))BEGINIFscore>=90THENSETgrade='优秀';ELSEIFscore>=60THENSETgrade='及格';ELSESETgrade='不及格';ENDIF;END//DELIMITER;

调用:

CALLGetGrade(85,@g);SELECT@g;-- 及格

🎯CASE语句:多个条件时更清晰

比IF更适合多个固定值的匹配:

DELIMITER//CREATEPROCEDUREGetWeekName(INday_numINT,OUTweek_nameVARCHAR(10))BEGINCASEday_numWHEN1THENSETweek_name='星期一';WHEN2THENSETweek_name='星期二';WHEN3THENSETweek_name='星期三';WHEN4THENSETweek_name='星期四';WHEN5THENSETweek_name='星期五';WHEN6THENSETweek_name='星期六';WHEN7THENSETweek_name='星期日';ELSESETweek_name='无效数字';ENDCASE;END//DELIMITER;

🎯WHILE循环:先判断后执行

批量插入数据(1到n):

DELIMITER//CREATEPROCEDUREBatchInsert(INnINT)BEGINDECLAREiINTDEFAULT1;WHILEi<=nDOINSERTINTOtest_table(value)VALUES(i);SETi=i+1;ENDWHILE;END//DELIMITER;

🎯LOOP循环:需配合 LEAVE 退出

DELIMITER//CREATEPROCEDURELoopExample(INnINT)BEGINDECLAREiINTDEFAULT1;loop_label:LOOPIFi>nTHENLEAVEloop_label;-- 退出循环ENDIF;INSERTINTOtest_table(value)VALUES(i);SETi=i+1;ENDLOOP;END//DELIMITER;

💡什么时候用哪种?

  • 简单条件分支 →IF
  • 多个固定值匹配 →CASE
  • 已知循环次数 →WHILE
  • 需要灵活控制(如无限循环+条件跳出) →LOOP

注意​:循环在数据量大时性能很差,实战中尽量避免。这里仅做语法演示。


五、查看和删除存储过程

查看所有存储过程

SHOWPROCEDURESTATUSWHEREDb='你的数据库名';

查看存储过程的创建语句

SHOWCREATEPROCEDURE过程名;

删除存储过程

DROPPROCEDUREIFEXISTS过程名;

六、新手避坑指南(血泪总结)


七、存储过程与视图的区别?

简单总结:

  • 只是查数据→视图
  • 需要返回单个计算结果→函数
  • 需要执行一系列操作(包括更新)→存储过程

八、今日学习心得

今天的内容总结成三句话:

  1. 存储过程就是数据库里的“函数”,封装复杂逻辑,一次编写多次调用
  2. 什么时候用​:复杂业务逻辑、批量数据处理、提高性能
  3. 关键命令​:CREATE PROCEDURECALLDROP PROCEDURE

👋 我是数据库小学妹一个用设计师思维学数据库的转行人
​我们一起,把复杂的技术变得简单有趣!**​💕—


本文为个人学习总结,所有命令均在MySQL 8.0环境下验证。存储过程是进阶技能,先掌握基础语法,再考虑实际应用。

http://www.jsqmd.com/news/674333/

相关文章:

  • Vue3项目里,除了clearFiles,Element-Plus上传组件还有哪些隐藏技巧?
  • 国际半导体全产业链展会推荐:全球覆盖上下游优质展会精选 - 品牌2026
  • 全国一体化算力网调度:政务 AI 规模化应用的算力底座如何搭建
  • 多视角视频扩散策略:一种三维时空-觉察视频动作模型
  • GD32F103串口调试:从printf重定向到中断收发,一个工程搞定所有(附完整代码)
  • JavaScript中严格模式use-strict对引擎解析的辅助
  • AIGC部署和生成图片
  • 移动号码状态查询 API 集成指南
  • Claude Code 安装报错 “不兼容 Windows 版本“ 完整修复记录
  • 【Dify v0.8+多模态调试黄金标准】:基于37个企业级部署案例验证的4层可观测性接入方案
  • 2026年评价高的新能源汽车改装榜单优选公司 - 行业平台推荐
  • Java项目如何零停机迁入Loom响应式架构?:2026最新3步渐进式改造路径(含Spring Boot 3.4+ Reactive Loom适配器实战)
  • 手机访问家里局域网共享文件?MoleSDN 叶子路由一步融入家庭内网
  • 010、展望:架构演化的逻辑与未来——效率、智能与硬件协同设计之路
  • 别光会explain()了!Spark 3.0+ 中这几个隐藏的执行计划模式更实用
  • 军用级水下动力系统标准方案(ROV/AUV/无人潜航器)
  • 【Dify 2026边缘部署权威指南】:20年架构师亲授7步极简落地法,错过再等三年
  • 当n和L大到1e18时,别再暴力模拟了!详解‘3437 melon’吃瓜问题的O(1)公式推导与边界条件处理
  • SCI 论文 Abstract 中 100 + 学术句式(2)
  • 告别手动布线烦恼:用Allegro快速布局STM32核心板的5个高效技巧
  • Spring Boot 4.0 Agent-Ready 架构深度解耦实践(Agent生命周期管理+无侵入监控+灰度探针部署大揭秘)
  • QMCDecode终极指南:3分钟解锁QQ音乐加密文件,让你的音乐收藏重获自由!
  • w w w w w w w w w w w w w
  • 新一代LoRA训练打标神器:支持多种打标风格,中英双语标签自由切换,打标效率飙升!
  • DolphinScheduler 3.x 集成 DataX 保姆级教程:从环境变量到HDFS权限,一次搞定所有坑
  • JVM GC 调优完全指南:从理论到生产实战
  • 探案教学智能体:通用化、可定制的AI探案教学系统
  • 解锁论文“黑科技”:书匠策AI带你玩转期刊论文全流程
  • q q q q q q q q q q q q q q q q q q q
  • Snap.Hutao:Windows原神玩家的7天效率提升完全指南