MySQL--》深入理解视图、存储过程与触发器的强大功能

目录

视图

检查选项

视图更新

存储过程

基本语法

变量操作

条件语句

游标使用

存储函数

触发器


视图

视图:(View)是一种虚拟存在的表,视图中的数据并不在数据库中实际存在·,行和列数据来自视图的查询中使用的表,并且是在使用视图时动态生成的。通俗来讲视图只保存了查询的SQL逻辑不保存查询结果,所以我们在创建视图的时候,主要工作就落在创建这条SQL查询语句上,创建视图的语句如下:

-- 创建视图 create or replace view 视图名称 as select 语句; -- 查询视图 show create view 视图名称; -- 查看创建视图语句 select * from 视图名称; --查看视图数据 -- 修改视图 create or replace view 视图名称 as select 语句; alter view 视图名称 as select 语句; -- 删除视图 drop view if exists 视图名称;

通过执行上面对视图操作的语句,可以通过如下动图可以看出:

检查选项

当使用with check option子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入、更新、删除以使其符合视图的定义,MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性,为了确定检查的范围,mysql提供了两个选项,cascaded和local,默认为cascaded,如下所示:

两者的区别在于:都会传递但cascaded不管依赖的试图写没写检查选项,都会检查。而local传递后,如果没写检查选项就不会检查。

视图更新

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系,如果视图包含以下任何一项,则该视图不可更新:

1)聚合函数或窗口函数函数(SUM()、MIN()、MAX()、COUNT()等)

2)distinct、group by、having、union 或 union all

视图作用:视图作用主要有以下几个方面:

1)简单:视图不仅可以简化用户对数据的理解也可以简化他们的操作,那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

2)安全:数据库可以授权但不能授权到数据库特定行和特定的列上,通过视图用户只能查询和修改他们所能见到的数据。

3)数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。

存储过程

存储过程:是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的,其特点是:封装重用;可以接受参数也可返回数据;减少网络交互并提升效率。

简单来说就是数据库SQL语言层面的代码封装与重用,如下图所示:

基本语法

存储过程的基本语法如下所示:

-- 创建 create procedure p1() begin -- 存储过程体 select count(*) from students; -- 查询学生表中的记录数 end; -- 调用 call p1(); -- 查看 select * from information_schema.routines where ROUTINE_SCHEMA = 'mysql_test'; -- 查看存储过程 show create procedure p1; -- 查看存储过程的创建信息 -- 删除 drop procedure if exists p1; -- 删除存储过程

注意:在命令行中执行创建存储过程SQL时,需要通过关键字delimiter指定SQL语句的结束符。

变量操作

在存储过程中除了基本的SQL语法外,我们还可以通过变量操作简便我们封装的SQL语句,接下来讲解一下在存储过程中的变量操作,如下:

系统变量:MySQL服务器提供不属于用户定义,属于服务器层面,分为全局变量(global)、会话变量(session)两种:

-- 查看系统变量 show global variables; -- 查看所有全局系统变量 show session variables; -- 查看所有会话系统变量 show global variables like '%char%'; -- 查看所有与字符集有关的全局系统变量 show session variables like '%char%'; -- 查看所有与字符集有关的会话系统变量 select @@global.autocommit; -- 查看全局系统变量名 -- 设置系统变量 set global autocommit=0; -- 设置全局系统变量

用户定义变量:是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接通过“@变量名”使用即可,其作用域为当前连接:

-- 用户变量赋值 set @myname = 'zhangsan'; set @myage := 20; set @mygender = '男'; select count(*) into @mycount from tb_user; -- 查询用户表的总记录数, 并赋值给变量 -- 使用变量 select @myname, @myage, @mygender, @mycount;

局部变量:是根据需要定义的在局部生效的变量,访问之前需要DECLARE声明,可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN…END块:

变量类型就是数据库字段类型:int、bigint、char、varchar、date、time等

-- 局部变量使用 声明declare create procedure p1() begin declare a int default 10; select count(*) into a from students; select a; end; call p1();
条件语句

在存储过程中除了基本的SQL语法外,我们还可以通过条件判断语句简便我们封装的SQL语句,接下来讲解一下在存储过程中的条件语句操作,如下:

我们在使用存储过程的存储体中,可以通过传递参数动态的实现数据的变化调用,参数类型如下:

类型

含义

in

该类参数作为输入,也就是需要调用时传入值

out

该类参数作为输出,也就是该参数可以作为返回值

inout

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

这里我们通过if语句进行演示,如下:

if判断语句:通过if…else if…else…end if;语句实现:

-- 方式一 create procedure p1(in score int,out result varchar(10)) begin if score>=85 then set result='优秀'; elseif score>=60 then set result='及格'; else set result='不及格'; end if; end; call p1(18, @result); select @result; -- 方式二 create procedure p2(inout score1 double) begin set score1 := score1*2; end; set @score1 := 10; call p2(@score1); select @score1;

case语句: 通过case…when…end case;语句实现:

create procedure p1(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('现在是', result); end; call p1(5);

while语句:while循环是有条件的循环控制语句,满足条件后再执行循环体中的SQL语句,具体语法如下:

create procedure p1(in n int) begin declare total int default 0; while n > 0 do set total := total + n; set n := n - 1; end while; select concat('结果是', total); end; call p1(5);

repeat语句:是有条件的循环控制语句,当满足条件的时候退出循环,具体语法为:

create procedure p1(in n int) begin declare total int default 0; repeat set total := total + n; set n := n - 1; until n <= 0 end repeat; select concat('结果是', total); end; call p1(5);

loop语句:loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件可以用其来实现简单的死循环,loop可以配合一下两个语句使用:

1)leave:配合循环使用,退出循环

2)lterate:必须用在循环中,作用是跳过当前循环剩下的语句直接进入下一次循环

create procedure p1(in n int) begin declare total int default 0; sum: loop if n <= 0 then leave sum; end if; if n%2 = 1 then set n := n - 1; iterate sum; end if; set total := total + n; set n := n - 1; end loop sum; select concat('结果是', total); end; call p1(100);

条件处理程序:handler可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤,其具体的语法如下所示:

游标使用

游标(cursor):是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环处理,游标的使用包括游标的声明、open、fetch和close,通过如下案例进行演示:

根据传入的参数uage来查询员工表emp中,所有的用户年龄小于等于uage的用户姓名name和职业job并将用户的姓名和专业插入到所创建的一张新表(id,name,job)中:

原emp表的内容如下所示:

create procedure a1(in uage int) begin declare uname varchar(100); -- 声明变量 declare ujob varchar(100); -- 声明变量 -- 声明游标,存储查询结果集 declare u_cursor cursor for select name, job from emp where age < uage; declare exit handler for sqlstate '02000' close u_cursor; -- 声明退出循环的条件 -- 创建表结构 drop table if exists temp_emp; -- 如果存在,则删除 create table if not exists temp_emp( id int primary key auto_increment, name varchar(100), job varchar(100) ); -- 开启游标 open u_cursor; -- 获取游标中的记录 while true do fetch u_cursor into uname, ujob; insert into temp_emp values (null, uname, ujob); end while; -- 关闭游标 close u_cursor; end; call a1(35);

执行游标操作之后,得到的新表如下所示:

存储函数

存储函数:是有返回值的存储过程,存储函数的参数只能是IN类型的。具体语法如下:

create function fun1(n int) returns int deterministic begin declare total int default 0; while n > 0 do set total := total + n; set n := n - 1; end while; return total; end; select fun1(5);

触发器

触发器:是与表有关的数据库对象,指在insert/update/delete之前或之后触发并执行触发器中定义的SQL语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的,现在触发器还只支持行级触发,不支持语句级触发,触发器的类型如下所示:

触发器类型

new 和 old

insert型触发器

new表示将要或者已经新增的数据

update型触发器

old表示修改之前的数据,new表示将要或已经修改后的数据

delete型触发器

old表示将要或者已经删除的数据

比如说如果我们想对下面这个员工表设置触发器监听表的修改删除更新操作,就可以创建一个日志表,如下所示:

插入触发器:接下来我们创建一个日志表然后设置一个触发器来监听其插入数据改变的日志记录:

-- 创建操作日志表 create table emp_logs ( id int(11) not null auto_increment, operation varchar(20) not null comment '操作类型, insert, update, delete', operate_time datetime not null comment '操作时间', operate_id int(11) not null comment '操作人id', operate_params varchar(500) comment '操作参数', primary key (id) ) engine = innodb default charset = utf8; -- 创建触发器 create trigger tb_emp_insert_trigger after insert on emp for each row begin insert into emp_logs(id, operation, operate_time, operate_id, operate_params) values (null, 'insert', now(), new.id, concat('插入的数据为:id=', new.id, ', name=', ifnull(new.name, '未知'), ', age=', ifnull(new.age, '未知'), ', salary=', ifnull(new.salary, '未知'), ', enter_date=', ifnull(new.enter_date, '未知'), ', manager_id=', ifnull(new.manager_id, '未知') ) ); end; -- 查看触发器 show triggers; -- 删除触发器 drop trigger tb_emp_insert_trigger;

然后我们插入一条数据到员工表emp当中:

-- 测试触发器 insert into emp value (null, '张三12', 20, '主管', 10000, now(), null)

可以看到我们的日志已经被成功打印出来了:

修改触发器:修改的触发器可以通过如下的方式进行,通过old和new分别拿到更新前后的数据:

-- 修改数据的触发器 create trigger tb_emp_update_trigger after update on emp for each row begin insert into emp_logs(id, operation, operate_time, operate_id, operate_params) values (null, 'update', now(), new.id, concat('插入的数据为:id=', new.id, ', name=', ifnull(new.name, '未知'), ', age=', ifnull(new.age, '未知'), ', salary=', ifnull(new.salary, '未知'), ', enter_date=', ifnull(new.enter_date, '未知'), ', manager_id=', ifnull(new.manager_id, '未知') ) ); end;

删除触发器:删除的触发器可以通过如下的方式进行,通过old拿到删除后的数据:

create trigger tb_emp_delete_trigger after delete on emp for each row begin insert into emp_logs(id, operation, operate_time, operate_id, operate_params) values (null, 'delete', now(), old.id, concat( '删除的数据:id=', old.id, ', name=', ifnull(old.name, '未知'), ', age=', ifnull(old.age, '未知'), ', salary=', ifnull(old.salary, '未知'), ', enter_date=', ifnull(old.enter_date, '未知'), ', manager_id=', ifnull(old.manager_id, '未知') ) ); end;

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

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

相关文章

【法学专业论文写作模版】未成年人犯罪低龄化问题及对策研究

目 录 引言 一、案情介绍及案例分析 &#xff08;一&#xff09;案情介绍 &#xff08;二&#xff09;案例分析及问题的引出 1.非刑罚类措施对未成年人如何适用 2.刑事责任年龄下调是否有利于预防未成年犯罪 3.家庭教育扮演着什么角色 二、我国目前未成年人犯罪低龄化的…

计算机网络必看:信道的极限容量,408真题常考!

计算机网络必看&#xff1a;信道的极限容量&#xff0c;408真题常考&#xff01;在学习计算机网络时&#xff0c;你是否曾困惑&#xff1a;“为什么网速不能无限快&#xff1f;” “一个信道到底能传多快&#xff1f;”这些问题的答案&#xff0c;就藏在信道的极限容量这个核心…

AI大模型开发学习指南:助你实现90%就业率和年薪72w+_AI爆了!最高年薪72w!

文章介绍AI大模型开发课程的就业优势&#xff1a;就业率超90%&#xff0c;最高年薪72万&#xff0c;应届生均薪15k。课程通过3.5个月系统学习&#xff0c;结合6大阶段和12个实战项目&#xff0c;帮助学员掌握大模型开发核心技能&#xff0c;达到2年工作经验等效竞争力。AI行业人…

【无人机三维路径规划】基于鳄鱼伏击算法CAOA多无人机协同路径规划(自定义:无人机数量)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

手机变+Linux+控制台?JuiceSSH+++cpolar远程连接让运维随时随地搞定

JuiceSSH 是安卓设备上的一款 SSH 工具&#xff0c;能通过 SSH/SCP 协议连接 Linux 服务器、虚拟机等设备&#xff0c;支持执行命令、传输文件&#xff0c;还有图形化界面和配置保存功能。它适合需要远程管理服务器的运维人员、开发者&#xff0c;以及家里有 NAS 等设备需要维护…

华为HCCDP-GaussDB工作级开发者题库(带详细解析)

同学们有考HCCDP-GaussDB工作级开发者的没&#xff1f;整理了一部分题库&#xff0c;需要的再学可以一起学习。完整的题库已经发布在“题主”小程序上了&#xff0c;可以自己去找一下。以下哪一项系统视图可用于定位单个session在特性级上的内存问题&#xff1f;A、SESSION_STA…

2026 GEO落地真相:SHEEP-GEO 98.7%续约率背后,12亿月活平台的优化实战报告

2026年GEO服务商评测&#xff1a;技术、效果与场景化选择指南据中国信通院《2026生成式AI商业应用白皮书》披露&#xff0c;2026年中国GEO&#xff08;生成式引擎优化&#xff09;市场规模将突破520亿元&#xff0c;同比增幅超210%。随着DeepSeek、豆包、Kimi、文心一言等主流A…

MySQL--》理解锁机制中的并发控制与优化策略

锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff0c;在数据库中除了传统的计算机资源(CPU、RAM、I/O)的争用以外&#xff0c;数据也是一种供许多用户共享的资源&#xff0c;如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0c;锁冲突…

LeetCode 2080 区间频率查询详解(哈希表 + 二分法)

深度解析&#xff1a;空间换时间的艺术 —— 从区间频率查询看哈希与二分 在处理大规模数据查询时&#xff0c;性能优化是核心。LeetCode 2080 题《区间内查询数字的频率》是一个绝佳的案例。本文将通过“哈希表预处理”与“二分查找”两大维度&#xff0c;带你领略现代 C 的解…

彻底搞懂浏览器原生录制:MediaRecorder API 深度解析

在现代 Web 开发中&#xff0c;音视频处理能力的边界正在不断扩展。过去依赖 Flash 或 Silverlight 插件才能实现的录制功能&#xff0c;如今已成为浏览器的原生能力。MediaRecorder API 正是这一变革的核心&#xff0c;它允许开发者直接在浏览器端捕获、编码并保存媒体流&…

AI大模型架构师必学指南:从知识储备到高薪前景,一篇收藏就够了!

AI大模型架构师是连接AI理论与产业落地的关键角色&#xff0c;需融合深度学习、分布式系统、软件工程等多领域知识。该岗位涵盖模型训练、部署与系统架构设计&#xff0c;要求兼具技术创新能力与行业洞察力。随着大模型在各行业广泛应用&#xff0c;人才需求激增&#xff0c;一…

IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛?

&#x1f310; IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛&#xff1f;连上 WiFi ≠ 能通信&#xff0c;真正的网络刚刚开始在 IoT 开发中&#xff0c;你一定见过这些现象&#xff1a; ESP32 显示 WiFi 已连接&#xff0c;但服务器连不上MQTT / HTTP 超时&#xff0c;但 TCP/IP …

MySql-9.1.0安装详细教程(保姆级)

目录 MySQL介绍&#xff1a; 一、下载 Mysql 安装文件 二、Mysql 安装教程 1.下载完成后进入解压&#xff0c;注意不要放在一个非中文路径下的文件夹下面否则后面会报错。我在此处解压放在了D盘MySQL目录下。 2.解压后的文件应该没有.ini文件。因此&#xff0c;需要创建in…

AI产品经理转型与大模型学习路线图,附赠全套学习资源_月薪3W的AI产品经理学习路线

文章提供了AI产品经理和大模型工程师的完整学习路线。AI产品经理路线包括基础知识、专业技能和软技能三大阶段&#xff0c;涵盖AI技术、产品管理等核心能力。大模型学习路线包括系统设计、提示词工程、平台应用开发等七个阶段&#xff0c;并提供相关学习资源。文章强调理论与实…

大模型学习宝典:从小白到专家的进阶之路,建议收藏反复阅读

文章介绍了大模型的基本概念、分类和应用场景&#xff0c;详细解释了大模型的训练过程&#xff08;预训练和微调&#xff09;&#xff0c;分析了当前"百模大战"的发展趋势及面临的挑战&#xff0c;包括失业、版权、偏见、犯罪和能耗等问题。大模型作为AI的重要发展方…

主流AI平台用户占55%,SHEEP-GEO凭五维模型成企业AI搜索战略伙伴

2026年&#xff0c;中国GEO&#xff08;生成式引擎优化&#xff09;市场迎来爆发式增长&#xff0c;行业预测显示市场规模将突破520亿元&#xff0c;同比增幅超190%。这一增长背后&#xff0c;是AI平台用户渗透率的快速提升——DeepSeek、豆包、元宝等主流平台用户占比已超55%&…

【ITK手册006】itk::Point 深度解析与实用指南

【ITK手册006】itk::Point 深度解析与实用指南 0. 概述 在 ITK (Insight Segmentation and Registration Toolkit) 的几何框架中&#xff0c;itk::Point 是最基础的类之一。它用于表示 n 维欧几里得空间中的一个静态位置&#xff08;坐标&#xff09;。 与 itk::Vector&#xf…

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用&#xff1f;修改它有什么影响&#xff1f;如何设置该参数&#xff0c;本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT C…

量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码

量化交易的核心在于将交易规则和策略转化为计算机可执行的代码。其中&#xff0c;技术指标的计算和基于这些指标生成交易信号是策略实现的基础环节。本文将深入探讨如何从零开始开发量化交易脚本&#xff0c;重点聚焦于常见技术指标的计算逻辑以及如何基于这些指标设计并实现信…

MySQL 数据增删改查

一、插入数据 1.1 insert插入数据 &#xff08;1&#xff09;insert语法格式 INSERT [INTO] 表名 [字段名] VALUES (值列表);&#xff08;2&#xff09;示例 ① 向学生表中插入一行数据② 向学生表中插入多行数据二、更新数据 2.1 update更新数据 &#xff08;1&#xff09;…