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

进阶提升!MySQL存储过程、触发器与视图实操指南

前三篇我们依次掌握了MySQL基础CRUD、进阶查询、事务、索引及数据备份已经能满足日常开发和企业级基础数据操作需求。但在实际工作中经常会遇到重复执行的SQL操作如批量处理数据、需要自动触发的业务逻辑如数据插入后自动更新关联表、简化复杂查询如多表关联查询无需重复写JOIN语句等场景。本文作为系列第四篇聚焦MySQL高级特性——存储过程、触发器与视图手把手教你通过这些特性简化开发流程、提升工作效率从“会操作数据”向“会高效管理数据”进阶一、前置准备复用环境与数据衔接前三篇本文继续沿用前三篇的student_db数据库、student表学生表和score表成绩表同时新增一张“班级表class”用于模拟更贴近企业级的关联场景所有案例均基于以下环境可直接复制执行补全数据-- 1. 确认并切换数据库USE student_db;-- 2. 新增班级表class用于关联学生表DROP TABLE IF EXISTS class; CREATE TABLE class ( class_id INT PRIMARY KEY AUTO_INCREMENT, class_name VARCHAR(50) NOT NULL UNIQUE, -- 班级名称唯一非空 teacher VARCHAR(50) NOT NULL, -- 班主任 student_count INT DEFAULT 0 -- 学生人数默认0 );-- 3. 插入班级测试数据INSERT INTO class (class_name, teacher, student_count) VALUES (计算机1班, 李老师, 2), (计算机2班, 王老师, 1), (计算机3班, 张老师, 1);-- 4. 确认已有表数据学生表、成绩表SELECT * FROM student; SELECT * FROM score; SELECT * FROM class;关键说明新增班级表后student表的class字段与class表的class_name字段关联后续将通过触发器、存储过程实现数据联动模拟企业级业务场景如新增学生时自动更新班级人数。二、核心知识点1存储过程批量执行SQL的“脚本”存储过程Stored Procedure是一组预编译好的SQL语句集合封装成一个“函数”可以通过调用名称重复执行适合重复执行的复杂SQL操作如批量插入数据、批量更新数据。其核心优势是简化代码、提高执行效率、减少网络传输。一存储过程的核心特点预编译第一次执行时MySQL会对存储过程进行编译后续调用无需重新编译执行速度更快。封装性将复杂的SQL逻辑封装成一个整体调用时只需输入参数无需关注内部实现。可复用一次创建多次调用避免重复编写相同SQL语句提升开发效率。支持参数可接收输入参数IN、输出参数OUT、输入输出参数INOUT适配不同业务场景。二存储过程的实操语法创建、调用、删除1. 创建存储过程CREATE PROCEDURE语法 DELIMITER // -- 临时修改语句结束符默认是;避免与存储过程内的;冲突 CREATE PROCEDURE 存储过程名(参数类型 参数名 数据类型) BEGIN -- 存储过程内的SQL语句集合 END // DELIMITER ; -- 恢复默认语句结束符 常用参数类型 - IN输入参数调用时传入值用于给存储过程传参 - OUT输出参数存储过程执行后返回值给调用者 - INOUT输入输出参数既传入值也返回值2. 实战案例新手必练3个场景案例1无参数存储过程——批量查询学生及对应成绩需求封装一个存储过程调用后直接查询所有学生的姓名、班级、科目及成绩无需重复写JOIN语句-- 1. 创建存储过程 DELIMITER // CREATE PROCEDURE query_student_score() BEGIN -- 多表关联查询逻辑 SELECT s.name, s.class, sc.subject, sc.score FROM student s INNER JOIN score sc ON s.id sc.student_id; END // DELIMITER ; -- 2. 调用存储过程直接输入存储过程名 CALL query_student_score();案例2IN参数存储过程——根据班级查询学生信息需求创建存储过程传入班级名称查询该班级所有学生的姓名、年龄、入学日期-- 1. 创建存储过程IN参数传入班级名称 DELIMITER // CREATE PROCEDURE query_student_by_class(IN class_name VARCHAR(50)) BEGIN SELECT name, age, admission_date FROM student WHERE class class_name; END // DELIMITER ; -- 2. 调用存储过程传入参数计算机1班 CALL query_student_by_class(计算机1班);案例3INOUT参数存储过程——统计指定班级的学生人数需求创建存储过程传入班级名称返回该班级的学生人数通过OUT参数返回结果-- 1. 创建存储过程IN传入班级名OUT返回人数 DELIMITER // CREATE PROCEDURE count_student_by_class(IN class_name VARCHAR(50), OUT student_num INT) BEGIN SELECT COUNT(*) INTO student_num -- 将统计结果赋值给OUT参数 FROM student WHERE class class_name; END // DELIMITER ; -- 2. 调用存储过程定义变量接收OUT参数 SET num 0; -- 定义变量num用于接收返回值 CALL count_student_by_class(计算机1班, num); SELECT num AS 班级学生人数; -- 查看返回结果3. 删除存储过程DROP PROCEDURE语法 DROP PROCEDURE IF EXISTS 存储过程名; 案例删除query_student_score存储过程 DROP PROCEDURE IF EXISTS query_student_score;避坑提醒1. 创建存储过程时必须先修改语句结束符DELIMITER否则会报错2. 存储过程内的SQL语句必须完整每个语句末尾需加;3. 调用带OUT参数的存储过程时需先定义变量接收返回值。三、核心知识点2触发器自动执行的“触发器”触发器Trigger是一种特殊的存储程序无需手动调用当指定的表发生插入INSERT、更新UPDATE、删除DELETE操作时会自动触发执行。其核心作用是实现数据联动、保证数据完整性、自动执行业务逻辑如新增学生时自动更新班级人数。一触发器的核心要素触发事件INSERT、UPDATE、DELETE只有这三种操作能触发触发器。触发时机BEFORE操作执行前触发、AFTER操作执行后触发。触发对象指定的表只有该表发生对应操作时才会触发。触发逻辑触发器执行的SQL语句可以是单条也可以是多条。二触发器的实操语法创建、查看、删除1. 创建触发器CREATE TRIGGER语法 DELIMITER // CREATE TRIGGER 触发器名 触发时机 触发事件 ON 表名 FOR EACH ROW -- 行级触发器每操作一行触发一次 BEGIN -- 触发器执行的SQL逻辑 END // DELIMITER ; 常用特殊变量 - NEW触发事件后新插入/更新的数据如INSERT后NEW.字段名表示新插入的字段值。 - OLD触发事件前原有的数据如DELETE前OLD.字段名表示被删除的字段值。2. 实战案例贴合业务新手必练案例1AFTER INSERT触发器——新增学生后自动更新班级表的学生人数需求当向student表插入新学生时自动找到该学生对应的班级将class表的student_count字段1--1. 创建触发器 DELIMITER // CREATE TRIGGER tri_student_insert AFTER INSERT ON student FOR EACH ROW BEGIN -- 更新班级表的学生人数NEW.class表示新插入学生的班级 UPDATE class SET student_count student_count 1 WHERE class_name NEW.class; END // DELIMITER ; -- 2. 测试触发器插入一条新学生数据 INSERT INTO student (name, age, admission_date, class) VALUES (孙七, 18, 2024-09-01, 计算机1班); -- 3. 查看结果班级表中计算机1班的学生人数应从2变为3 SELECT * FROM class WHERE class_name 计算机1班;案例2AFTER DELETE触发器——删除学生后自动更新班级表的学生人数需求当从student表删除学生时自动找到该学生对应的班级将class表的student_count字段-1-- 1. 创建触发器 DELIMITER // CREATE TRIGGER tri_student_delete AFTER DELETE ON student FOR EACH ROW BEGIN -- 更新班级表的学生人数OLD.class表示被删除学生的班级 UPDATE class SET student_count student_count - 1 WHERE class_name OLD.class; END // DELIMITER ; -- 2. 测试触发器删除刚插入的孙七 DELETE FROM student WHERE name 孙七; -- 3. 查看结果班级表中计算机1班的学生人数应从3变回2 SELECT * FROM class WHERE class_name 计算机1班;案例3BEFORE UPDATE触发器——修改学生班级时同步更新两个班级的人数需求当修改student表中学生的班级时原班级人数-1新班级人数1-- 1. 创建触发器 DELIMITER // CREATE TRIGGER tri_student_update BEFORE UPDATE ON student FOR EACH ROW BEGIN -- 原班级人数-1OLD.class表示修改前的班级 UPDATE class SET student_count student_count - 1 WHERE class_name OLD.class; -- 新班级人数1NEW.class表示修改后的班级 UPDATE class SET student_count student_count 1 WHERE class_name NEW.class; END // DELIMITER ; -- 2. 测试触发器将李四的班级从计算机1班改为计算机2班 UPDATE student SET class 计算机2班 WHERE name 李四; -- 3. 查看结果计算机1班人数-1计算机2班人数1 SELECT * FROM class WHERE class_name IN (计算机1班, 计算机2班);3. 查看与删除触发器-- 查看所有触发器SHOW TRIGGERS;-- 查看指定表的触发器SHOW TRIGGERS LIKE student;-- 删除触发器DROP TRIGGER IF EXISTS 触发器名;案例删除tri_student_update触发器 DROP TRIGGER IF EXISTS tri_student_update;避坑提醒1. 触发器不能嵌套触发器内不能触发另一个触发器2. 避免在触发器中执行复杂SQL会影响操作效率3. 同一表、同一触发时机、同一触发事件只能有一个触发器。四、核心知识点3视图简化复杂查询的“虚拟表”视图View是基于一个或多个表的查询结果构建的虚拟表它本身不存储数据只存储查询逻辑每次访问视图时MySQL会自动执行对应的查询语句返回最新数据。其核心作用是简化复杂查询、隐藏数据结构、控制数据访问权限。一视图的核心特点虚拟性视图不存储数据数据来源于底层的基础表基础表数据更新后视图数据也会同步更新。简化性将复杂的多表关联、聚合查询封装成视图访问时只需查询视图无需重复编写复杂SQL。安全性可以通过视图只展示基础表的部分字段隐藏敏感数据如密码、身份证号控制用户访问权限。二视图的实操语法创建、查询、修改、删除1. 创建视图CREATE VIEW语法CREATE VIEW 视图名 AS 查询语句;核心查询语句可以是单表查询、多表关联查询、聚合查询等任意合法的SQL查询语句。2. 实战案例新手必练案例1创建单表视图——简化学生信息查询需求创建视图只展示学生的姓名、班级、年龄隐藏id、admission_date等字段-- 创建视图 CREATE VIEW v_student_info AS SELECT name, class, age FROM student; -- 查询视图与查询普通表一样 SELECT * FROM v_student_info;案例2创建多表关联视图——简化学生成绩查询需求创建视图展示学生姓名、班级、科目、成绩、班主任信息关联student、score、class三张表-- 创建视图 CREATE VIEW v_student_score_teacher AS SELECT s.name, s.class, sc.subject, sc.score, c.teacher FROM student s INNER JOIN score sc ON s.id sc.student_id INNER JOIN class c ON s.class c.class_name; -- 查询视图无需重复写JOIN语句 SELECT * FROM v_student_score_teacher; -- 条件筛选与普通表查询一致 SELECT * FROM v_student_score_teacher WHERE class 计算机1班;案例3创建聚合视图——统计各班级各科目平均分需求创建视图展示班级名称、科目、平均分简化聚合查询操作-- 创建视图 CREATE VIEW v_class_subject_avg AS SELECT c.class_name, sc.subject, AVG(sc.score) AS avg_score FROM class c INNER JOIN student s ON c.class_name s.class INNER JOIN score sc ON s.id sc.student_id GROUP BY c.class_name, sc.subject; -- 查询视图 SELECT * FROM v_class_subject_avg;3. 修改与删除视图-- 修改视图两种方式 方式1ALTER VIEW 视图名 AS 新的查询语句; 方式2DROP VIEW IF EXISTS 视图名; CREATE VIEW 视图名 AS 新的查询语句; -- 删除视图 DROP VIEW IF EXISTS 视图名; 案例修改v_student_info视图新增入学日期字段 ALTER VIEW v_student_info AS SELECT name, class, age, admission_date FROM student;实用提醒1. 视图一般用于查询不建议用于插入、更新、删除操作可能会影响基础表数据完整性2. 若基础表结构发生变化如新增/删除字段视图可能会失效需重新创建或修改。五、总结与下一篇预告本文重点讲解了MySQL三大高级特性存储过程批量执行SQL提升复用性、触发器自动执行业务逻辑保证数据联动、视图简化复杂查询控制数据安全这些特性在企业级开发中应用广泛能有效简化开发流程、提升工作效率避免重复劳动。实操建议重点练习存储过程的参数使用、触发器的触发逻辑、视图的创建与查询建议结合本文案例亲手执行每一条语句理解其核心原理——尤其是触发器的NEW/OLD变量、视图的虚拟性避免“死记硬背”。下一篇预告将讲解MySQL的数据类型进阶、约束详解与常见错误排查帮你规范表结构设计、规避数据异常进一步夯实数据库基础应对更复杂的企业级开发场景如果觉得本文对你有帮助欢迎点赞、收藏评论区留言交流你在存储过程、触发器或视图中遇到的问题

相关文章:

进阶提升!MySQL存储过程、触发器与视图实操指南

前三篇我们依次掌握了MySQL基础CRUD、进阶查询、事务、索引及数据备份,已经能满足日常开发和企业级基础数据操作需求。但在实际工作中,经常会遇到重复执行的SQL操作(如批量处理数据)、需要自动触发的业务逻辑(如数据插…...

# Bug 报告:openai-codex provider broken since 2026.4.5 �� Cloudflare challenge + missing OAuth scope /

Bug 报告:openai-codex provider broken since 2026.4.5 �� Cloudflare challenge + missing OAuth scope / openai-codex provider broken since 2026.4.5 - Cloudflare challenge + missing OAuth scope 链接: https://blog.csdn.net/cosmoslife 作者: cosmoslife 日期: 2…...

共探智能医疗与人工智能的新时代 | IHAI 2026

探索智能医疗与AI的未来 | IHAI 2026 国际会议 地点: 中国玉溪会议简介2026年智能医疗与人工智能国际会议(IHAI 2026)将于本年度在中国玉溪举行。这座融合了自然美景与多元文化的古城将迎来全球智能医疗和人工智能领域的顶尖专家、学者及行业领袖。本次大…...

告别乱码!手把手教你用LvglFontTool为LVGL嵌入式UI制作中文字库(附SPI Flash/SD卡存储方案)

嵌入式UI开发实战:LVGL中文字库高效制作与存储方案全解析 在嵌入式系统开发中,图形用户界面(GUI)的中文显示一直是开发者面临的棘手问题。当你在STM32或ESP32上使用LVGL构建交互界面时,是否遇到过这样的场景:精心设计的界面在显示…...

【硬件】2026最适合做家用NAS的CPU是哪一款

家用NAS没有绝对“唯一最优”的CPU,核心是匹配你的预算、功能需求和功耗预期。结合2026年的市场现状、软件兼容性和实测表现,以下是分场景的精准推荐,覆盖99%的家用需求,同时附上核心选型原则和避坑指南。 核心选型黄金原则&#…...

s2-pro参数调优指南:Max New Tokens与Chunk Length对语音连贯性影响

s2-pro参数调优指南:Max New Tokens与Chunk Length对语音连贯性影响 1. 引言 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,在文本转语音领域表现出色。它不仅支持基础的文本转语音功能,还能通过参考音频复用特定音色,为语…...

告别printf调试:用NRF52832的UART串口实现高效日志输出(附SDK15.3配置)

NRF52832串口日志实战:从printf到高效调试的进阶之路 调试嵌入式系统就像在黑暗房间里找钥匙——传统printf调试如同每次开灯看一眼又关上,而UART日志系统则是装上了智能照明,让问题无处遁形。对于NRF52832这样的低功耗蓝牙芯片开发者来说&am…...

商城小程序,不只是卖货这么简单

在数字化浪潮席卷各行各业的今天,商城小程序早已不是新鲜事物。但真正把商城小程序做深、做透,让它适配千行百业的差异化需求,却并非一件容易的事。我们深耕软件开发多年,发现很多客户对商城小程序的认知还停留在“线上摆个摊”的…...

洛谷 P1381 单词背诵

题目描述灵梦有 n 个单词想要背,但她想通过一篇文章中的一段来记住这些单词。文章由 m 个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个)。并且在背诵的单词量尽量多的情况下&…...

批量归一化基础:让模型训练更稳定

文章目录前言一、没BN的深度学习有多难?先懂痛点再学技术1.1 内部协变量偏移:网络每层都在“乱变”1.2 梯度消失与爆炸:深层网络的“拦路虎”1.3 调参难如登天:对初始化和学习率极度敏感二、批量归一化到底是什么?一句…...

常见网络攻击

DDoS攻击,CC攻击 CC攻击 DDoS的一种 发送大量的合法请求消耗应用层的资源(CPU,内存,数据等),耗尽资源,比如在教务网站中写死循环脚本持续访问某个资源,无技术难度 防御: 对同IP限流,验证码,行为分析 DDoS 全名分布式拒绝攻击,攻击者控制大量僵尸设备(被植入病毒的电脑,服…...

NaViL-9B多模态模型应用:智能识别图片内容,轻松实现图文对话

NaViL-9B多模态模型应用:智能识别图片内容,轻松实现图文对话 1. NaViL-9B模型概述 NaViL-9B是上海人工智能实验室研发的原生多模态大语言模型,具备同时处理文本和图像信息的能力。与传统的单一模态模型不同,NaViL-9B能够理解图片…...

从linspace到logspace:Matlab新手必须掌握的两种‘间距’生成函数对比指南

从linspace到logspace:Matlab新手必须掌握的两种‘间距’生成函数对比指南 刚接触Matlab的工程师或科研人员,常常会被各种数据生成函数弄得眼花缭乱。特别是在需要创建特定间隔的数值序列时,linspace和logspace这两个看似简单的函数&#xff…...

企业级大模型API中转站实测对比:主线、备线怎么排更合理

很多团队做大模型接入时,会先问一个看起来很直接的问题:哪家 API 中转站更强。可只要项目进入正式阶段,你就会发现,这个问题本身问得还不够工程化。更现实的问法通常是:谁适合做主线,谁适合做备线&#xff…...

品牌却从未出现在 AI 搜索回答推荐中

说真的,现在绝大多数品牌在 AI 搜索里拿不到曝光,根本不是内容发的少,也不是全网营销做的不好,是从根上就没搞懂,AI 搜索选内容、推品牌的逻辑,和传统的全网营销,完全是两码事。截至 2025 年 12…...

Flux Sea Studio 性能基准测试:不同GPU型号下的生成速度对比

Flux Sea Studio 性能基准测试:不同GPU型号下的生成速度对比 最近在折腾AI生图,特别是用Flux Sea Studio,发现一个挺实际的问题:选什么GPU?是咬牙上顶配的RTX 4090,还是性价比更高的RTX 3080?它…...

证券行业-股票行情指标模型的简单介绍

在证券行业,股票行情指标模型是连接“数据”与“决策”的桥梁。它不仅仅是看K线,而是通过一套标准化的数学逻辑,将无序的价格波动转化为可执行的交易信号。这些模型主要分为技术分析模型(看图择时)和量化因子模型&…...

2026 最新 从零搭建本地大模型 RAG 知识库问答系统:基于 Llama 3.2 8B 量化版 + LangChain+Chroma,全流程代码实操 + 踩坑指南

2026最新 从零搭建本地大模型RAG知识库问答系统:基于Llama 3.2 8B量化版LangChainChroma,全流程代码实操踩坑指南 【本文首发CSDN,未经授权禁止转载】 文章目录 文章目录2026最新 从零搭建本地大模型RAG知识库问答系统:基于Llam…...

餐饮零售AI视觉助手Ostrakon-VL-8B:开箱即用,一键部署实战

餐饮零售AI视觉助手Ostrakon-VL-8B:开箱即用,一键部署实战 1. 为什么选择Ostrakon-VL-8B? 在餐饮零售行业,每天都有大量视觉数据需要处理:货架商品、门店环境、价格标签等。传统人工检查方式效率低、成本高且容易出错…...

STEP3-VL-10B惊艳效果:手写体+印刷体混合文档端到端识别与语义整合

STEP3-VL-10B惊艳效果:手写体印刷体混合文档端到端识别与语义整合 1. 引言 想象一下,你手头有一份会议记录,上面既有打印的会议议程,又有参会者手写的笔记和批注。或者是一份学生作业,题目是印刷体,答案却…...

一键部署Pi0具身智能:快速体验3.5B参数模型,生成标准机器人控制数据

一键部署Pi0具身智能:快速体验3.5B参数模型,生成标准机器人控制数据 1. Pi0具身智能模型简介 Pi0(π₀)是Physical Intelligence公司开发的视觉-语言-动作(VLA)基础模型,代表了当前具身智能领…...

YOLOv10镜像体验:开箱即用的目标检测环境,省心又高效

YOLOv10镜像体验:开箱即用的目标检测环境,省心又高效 1. 为什么选择YOLOv10镜像 在目标检测领域,环境配置一直是开发者面临的最大痛点之一。我曾经花费整整两天时间调试CUDA版本与PyTorch的兼容性问题,这种经历相信很多同行都深有…...

2026企业文档选型白皮书:功能、技术栈、私有化部署与采购建议

核心结论:企业文档工具市场年复合增长率达46.7%。对于有数据安全、二次开发需求的企业,支持私有化部署源码开放的方案(如JVS企业文档)已成为技术团队的优先选择。本文基于11款主流产品深度评测,提供功能对比矩阵、技术…...

从零搭建个人知识库问答系统:我的 Spring AI + RAG 学习实践

一个基于 Spring AI 和 RAG 技术的个人知识库问答 Agent 项目分享 地址:nestNe/personal-knowledge-rag: 基于SpringAI,通过上传自己的知识库,创建个性化的模型回答问题https://github.com/nestNe/personal-knowledge-rag目前还在开发中&…...

LLM生成代码如何逃过SAST/SCA检测?:一文拆解3层语义级审查盲区与可落地的增强审查Checklist(含YAML模板)

第一章:LLM生成代码如何逃过SAST/SCA检测?:一文拆解3层语义级审查盲区与可落地的增强审查Checklist(含YAML模板) 2026奇点智能技术大会(https://ml-summit.org) 大语言模型生成的代码常在语法合法、结构合规的前提下…...

告别AD7689!用STM32双SPI同步采集,低成本升级到16通道AD7616的实战指南

从AD7689到AD7616:基于STM32双SPI的16通道同步采集系统实战 在工业自动化、医疗设备和测试测量领域,多通道高精度数据采集系统的需求日益增长。许多工程师最初会选择AD7689这类单通道ADC作为解决方案,但随着项目复杂度提升,通道扩…...

SerialPlot终极指南:3分钟快速上手串口数据可视化工具

SerialPlot终极指南:3分钟快速上手串口数据可视化工具 【免费下载链接】serialplot Small and simple software for plotting data from serial port in realtime. 项目地址: https://gitcode.com/gh_mirrors/se/serialplot 你是否曾面对串口输出的海量数字数…...

用陶晶驰串口屏和STM32F407做个简易扫频仪:手把手教你绘制幅频特性曲线

用陶晶驰串口屏和STM32F407打造扫频仪:从硬件搭建到曲线绘制的完整指南 在电子测量领域,扫频仪是分析电路频率响应的基础工具。商用设备往往价格昂贵,而利用陶晶驰串口屏和STM32F407开发板,我们可以构建一个成本低廉但功能完备的简…...

行业词典融入:提升gte-base-zh在垂直领域的语义理解

行业词典融入:提升gte-base-zh在垂直领域的语义理解 最近在做一个金融领域的智能问答项目,用到了gte-base-zh这个中文通用文本嵌入模型。模型本身效果不错,但一遇到“量化宽松”、“M2增速”、“同业存单”这类专业术语,语义抓取…...

TMS320F28335实战:IQmath库从安装到三角函数应用全解析

TMS320F28335实战:IQmath库从安装到三角函数应用全解析 在嵌入式系统开发中,实时计算能力往往决定着整个系统的性能上限。德州仪器(TI)的TMS320F28335作为一款广泛应用于工业控制、电机驱动和电力电子领域的DSP芯片,其强大的浮点运算单元(FPU…...