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

news2026/4/27 6:06:15
前三篇我们依次掌握了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的数据类型进阶、约束详解与常见错误排查帮你规范表结构设计、规避数据异常进一步夯实数据库基础应对更复杂的企业级开发场景如果觉得本文对你有帮助欢迎点赞、收藏评论区留言交流你在存储过程、触发器或视图中遇到的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2529185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…