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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
PolarClaw,2核4GB
简介: 数据库也能“写脚本”!存储过程是预编译的SQL代码包,支持参数、变量、条件判断与循环,可一键执行多步操作(如更新+插入+删除),提升复用性、减少网络开销。新手入门必备进阶技能!

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

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

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

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

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


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

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

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

为什么需要它?

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

二、什么是存储过程?

📚基本语法

DELIMITER //

CREATE PROCEDURE 过程名()
BEGIN
    -- 这里写SQL语句
    SELECT 'Hello, Database!';
END //

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

调用存储过程

CALL 过程名();

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

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

DELIMITER //

CREATE PROCEDURE InsertLog()
BEGIN
    INSERT INTO logs (message, created_at) 
    VALUES ('存储过程被执行了', NOW());
END //

DELIMITER ;

调用:

CALL InsertLog();

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


三、存储过程的参数类型

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

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

DELIMITER //

CREATE PROCEDURE GetUserName(IN user_id INT)
BEGIN
    SELECT name FROM users WHERE id = user_id;
END //

DELIMITER ;

调用:

CALL GetUserName(1);

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

DELIMITER //

CREATE PROCEDURE GetUserCount(OUT total INT)
BEGIN
    SELECT COUNT(*) INTO total FROM users;
END //

DELIMITER ;

调用:

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

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

DELIMITER //

CREATE PROCEDURE DoubleNumber(INOUT num INT)
BEGIN
    SET num = num * 2;
END //

DELIMITER ;

调用:

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

四、存储过程的控制结构

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

🎯定义变量

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

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

DELIMITER //

CREATE PROCEDURE GetGrade(IN score INT, OUT grade VARCHAR(10))
BEGIN
    IF score >= 90 THEN
        SET grade = '优秀';
    ELSEIF score >= 60 THEN
        SET grade = '及格';
    ELSE
        SET grade = '不及格';
    END IF;
END //

DELIMITER ;

调用:

CALL GetGrade(85, @g);
SELECT @g;   -- 及格

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

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

DELIMITER //

CREATE PROCEDURE GetWeekName(IN day_num INT, OUT week_name VARCHAR(10))
BEGIN
    CASE day_num
        WHEN 1 THEN SET week_name = '星期一';
        WHEN 2 THEN SET week_name = '星期二';
        WHEN 3 THEN SET week_name = '星期三';
        WHEN 4 THEN SET week_name = '星期四';
        WHEN 5 THEN SET week_name = '星期五';
        WHEN 6 THEN SET week_name = '星期六';
        WHEN 7 THEN SET week_name = '星期日';
        ELSE SET week_name = '无效数字';
    END CASE;
END //

DELIMITER ;

🎯WHILE循环:先判断后执行

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

DELIMITER //

CREATE PROCEDURE BatchInsert(IN n INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= n DO
        INSERT INTO test_table (value) VALUES (i);
        SET i = i + 1;
    END WHILE;
END //

DELIMITER ;

🎯LOOP循环:需配合 LEAVE 退出

DELIMITER //

CREATE PROCEDURE LoopExample(IN n INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    loop_label: LOOP
        IF i > n THEN
            LEAVE loop_label;   -- 退出循环
        END IF;
        INSERT INTO test_table (value) VALUES (i);
        SET i = i + 1;
    END LOOP;
END //

DELIMITER ;

💡 什么时候用哪种?

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

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


五、查看和删除存储过程

查看所有存储过程

SHOW PROCEDURE STATUS WHERE Db = '你的数据库名';

查看存储过程的创建语句

SHOW CREATE PROCEDURE 过程名;

删除存储过程

DROP PROCEDURE IF EXISTS 过程名;

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

image_04202.png


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

image_04203.png

简单总结:

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

八、今日学习心得

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

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

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


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

相关文章
|
17天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34827 46
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
12天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
11382 36
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
7天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2387 24
|
29天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45733 157
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
5天前
|
人工智能 弹性计算 安全
Hermes Agent是什么?怎么部署?超详细实操教程
Hermes Agent 是 Nous Research 于2026年2月开源的自进化AI智能体,支持跨会话持久记忆、自动提炼可复用技能、多平台接入与200+模型切换,真正实现“越用越懂你”。MIT协议,部署灵活,隐私可控。
1597 3
|
12天前
|
机器学习/深度学习 存储 人工智能
还在手写Skill?hermes-agent 让 Agent 自己进化能力
Hermes-agent 是 GitHub 23k+ Star 的开源项目,突破传统 Agent 依赖人工编写Aegnt Skill 的瓶颈,首创“自我进化”机制:通过失败→反思→自动生成技能→持续优化的闭环,让 Agent 在实践中自主构建、更新技能库,持续自我改进。
1785 6