MySQL数据库进阶第四篇(视图/存储过程/触发器)


在这篇博文中,将深入探讨了视图的创建、检查选项、更新及其作用,并详细介绍了存储过程与触发器的概念、创建、调用、查看以及删除的方法。文章通过丰富的示例和图片清晰地展示了语法和实践操作,对于数据库管理系统的学习者和专业人士提供了实用的指导。尤其是对于MySQL中视图与存储过程的增删改查(CRUD)操作、条件分支(IF/CASE)、循环控制(WHILE/REPEAT/LOOP)及游标使用的详细解说,都有助于读者更好地理解和运用这些数据库对象,以便于更加高效地进行数据操作和管理。此外,文章还涉及了异常处理和存储函数的使用技巧,为数据库编程提供了有力的支持。通过阅读这篇文章,可以帮助用户简化操作,保证数据安全,应对真实结构变化,以及优化业务逻辑实现。

一、视图简单介绍与基础语法

在这里插入图片描述
操作语法:
在这里插入图片描述
视图的创建、查看、修改、删除

# 创建
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
# 查询
SHOW CREATE VIEW 视图名称;      # 查看创建视图语句
SELECT * FROM 视图名称 ...... ; # 查看视图数据
# 修改 方式一
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH
[ CASCADED | LOCAL ] CHECK OPTION ]
# 修改 方式二
ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED |
LOCAL ] CHECK OPTION ]
# 删除
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...

二、视图的检查选项

使用子句with check option创建视图时,MYSQL会通过视图检查正在更改的每行(插入,更新,删除等操作)是否符合视图的定义。MySQL允许基于一个视图创建另一个视图,并检查依赖视图中的规则以保持一致性。为了确定检查的范围,提供了两个选项

在这里插入图片描述

WITH CASCADED CHECK OPTION 是指在更新视图时,会检查视图中所有相关的视图和基表的约束。如果更新操作违反了任何一个相关表的约束条件,更新将被拒绝。
WITH LOCAL CHECK OPTION 是指在更新视图时,仅检查当前视图的约束条件。如果更新操作违反了当前视图的约束条件,更新将被拒绝。不会检查其他相关表的约束条件。

三、视图的更新

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。

如果视图包含以下任何一 项,则该视图不可更新:

聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
DISTINCT C. GROUP BY D. HAVING E. UNION 或者 UNION ALL

举例:create view v1 as select count(*) from student;
insert int v1 values(10);

​ 报错,提示当前视图不能插入数据,因为count(*) 的结果 没有 和student一样是一一对应的关系

四、视图的作用

在这里插入图片描述
简单:把复杂查询条件定义为视图,简化用户操作
安全:数据库可以通过视图 保证了某些数据的安全性,通过视图 用户只能查询和修改它们所能见到的数据
数据独立:帮助用户屏蔽真实结构变化带来的影响

五、存储过程的概念与特点

概念:是一段预先编译并保存在数据库中的可重复使用的代码块。存储过程由一系列的 SQL 语句和控制流语句组成,可以接受参数,并且可以返回结果。存储过程通常用于执行复杂的数据库操作,实现业务逻辑和数据处理等任务。
在这里插入图片描述

六、存储过程的 创建,调用,查看,删除

# ****************************创建****************************
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ])
BEGIN
-- SQL语句
END ;
# ****************************调用****************************
CALL 名称 ([ 参数 ]);
# ****************************查看****************************
-- 查询指定数据库的存储过程及状态信息
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; 
-- 查询某个存储过程的定义
SHOW CREATE PROCEDURE 存储过程名称; 
# ****************************删除****************************
DROP PROCEDURE [ IF EXISTS ] 存储过程名称;
# ****************************举例****************************
delimiter $$  #设置MySQL语句结束符为$$
create procedure p1()
beginselect count(*) from student;
end$$
delimiter ; #再设置为默认初始的 ;
call p1();  # 调用p1
drop procedure if exists p1; # 删除p1

七、存储过程 — 系统变量

在这里插入图片描述

注意:

如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量

mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置。

八、存储过程 — 用户定义变量

在这里插入图片描述
在这里插入图片描述

九、存储过程 — 局部变量

在这里插入图片描述

# 查看系统变量 如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量
SHOW [ SESSION | GLOBAL ] VARIABLES ; -- 查看所有系统变量
SHOW [ SESSION | GLOBAL ] VARIABLES LIKE 'xxx'; -- 可以通过LIKE模糊匹配方式查找变量
SELECT @@[SESSION | GLOBAL] 系统变量名; -- 查看指定变量的值
# 设置系统变量
SET [ SESSION | GLOBAL ] 系统变量名 =;
SET @@[SESSION | GLOBAL]系统变量名 =;# 赋值 用户定义变量  赋值时,可以使用 = ,也可以使用 := 
SET @var_name = expr [, @var_name = expr] ... ;
SET @var_name := expr [, @var_name := expr] ... ;
# 使用 用户定义变量  用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL
SELECT @var_name ;# 声明 局部变量
DECLARE 变量名 变量类型 [DEFAULT ... ] ;
# 赋值 局部变量
SET 变量名 =;
SET 变量名 :=;
SELECT 字段名 INTO 变量名 FROM 表名 ... ;

十、存储过程 — if 判断

if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有。 ELSE结构可以有,也可以没有
在这里插入图片描述

IF 条件1 THEN..... # 条件1 成立执行该THEN后的语句
ELSEIF 条件2 THEN -- 可选..... # 条件2 成立执行该THEN后的语句
ELSE -- 可选..... # 以上条件都不成立 成立执行该THEN后的语句
END IF;
# ---------------------举例:根据定义参数score,判定当前分数对应等级--------------------
drop procedure if exists p3;
create procedure p3()
begindeclare score int default 58; #声明变量score为58,判断其分数等级declare grade varchar(10); #用于接收等级if score >= 85 thenset grade := '优秀';elseif score >= 60 thenset grade := '及格';elseset grade := '不及格';end if;select grade;
end;
call p3; # 不及格

十一、存储过程 — 参数

在这里插入图片描述

CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ])
BEGIN-- SQL语句
END ;
#---------------------举例:根据传入的200分制的分数,返回换算成百分制分数---------------------
create procedure  p5(inout score double)
beginset score := score * 0.5;
end;
set @myscore := 180;
call p5(@myscore);
select @myscore; # 90
# ---------------------举例:根据传入参数score,判定并返回当前分数对应等级--------------------
drop procedure if exists p4;
create procedure p4(in score int, out grade varchar(10))
beginif score >= 85 thenset grade := '优秀';elseif score >= 60 thenset grade := '及格';elseset grade := '不及格';end if;
end;
call p4(66,@mygrade); # 调用时,直接传入两个参数,使用用户自定义变量接收grade的值
select @mygrade;

十二、存储过程 — case

case结构及作用,与基础篇中的流程控制函数类似,两种语法格式:
在这里插入图片描述

#语法1,含义: 当case_value的值为 when_value1时,执行statement_list1,当值为 when_value2时,执行statement_list2, 否则就执行 statement_list
CASE case_valueWHEN when_value1 THEN statement_list1[ WHEN when_value2 THEN statement_list2] ...[ ELSE statement_list ]
END CASE;
#语法2,含义: 当条件search_condition1成立时,执行statement_list1,当条件search_condition2成立时,执行statement_list2, 否则就执行 statement_list
CASEWHEN search_condition1 THEN statement_list1[WHEN search_condition2 THEN statement_list2] ...[ELSE statement_list]
END CASE;
#---------------------举例:根据传入的月份,判定所属季度---------------------
drop procedure if exists p6;
create procedure p6(in month int)
begindeclare ans varchar(10);casewhen month in (1,2,3)then set ans := '第一季度';when month in (4,5,6)then set ans := '第二季度';when month in (7,8,9)then set ans := '第三季度';when month in (10,11,12)then set ans := '第四季度';end case;select concat('您输入的月份为:',month, ',所在季度是:',ans);
end;call p6(10); # 第四季度

十三、存储过程 — while

在这里插入图片描述

-- 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE 条件 DOSQL逻辑...
END WHILE;
#---------------------举例:计算从1累加到n的和,n为传入的参数值---------------------
drop procedure if exists p7;
create procedure p7(in n int)
begindeclare sum int default 0;while n > 0 doset sum := sum + n;set n := n - 1;end while;select concat('从1到n的和为:',sum);
end;
call p7(10); #55

十四、存储过程 — repeat

在这里插入图片描述

-- 先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环
REPEATSQL逻辑...UNTIL 条件
END REPEAT;
#---------------------举例:计算从1累加到n的和,n为传入的参数值---------------------
drop procedure if exists p8;
create procedure p8(in n int)
begindeclare sum int default 0;repeatset sum := sum + n;set n := n - 1;until  n = 0end repeat;select concat('从1到n的和为:',sum);
end;
call p8(100); #5050

十四、存储过程 — loop

在这里插入图片描述
LOOP可以配合以下两个语句使用:

LEAVE :配合循环使用,退出循环
ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环

[begin_label:] LOOPSQL逻辑...
END LOOP [end_label];LEAVE label; -- 退出指定标记的循环体
ITERATE label; -- 直接进入下一次循环
#  begin_label,end_label,label 都是自定义的标记#---------------------举例:计算从1累加到n的偶数和,n为传入的参数值---------------------
drop procedure if exists p10;
create procedure p10(in n int)
begindeclare sum int default 0;getsum:loop #循环代码if n = 0 thenleave getsum; # 退出循环 leaveend if;if n%2 = 1 thenset n := n - 1;ITERATE getsum;end if;set sum := sum + n;set n := n - 1;end loop getsum;select concat('从1到n的和为:',sum);
end;
call p10(10); #30

十四、存储过程 — 游标(CURSOR)

在这里插入图片描述

# 声明游标
DECLARE 游标名称 CURSOR FOR 查询语句 ;
# 打开游标
OPEN 游标名称 ;
# 获取游标记录
FETCH 游标名称 INTO 变量 [, 变量 ] ;
# 关闭游标
CLOSE 游标名称 ;

十五、存储过程 — 条件处理程序(Handler)

在这里插入图片描述

DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement ;handler_action:CONTINUE: 继续执行当前程序EXIT: 终止执行当前程序condition_value:SQLSTATE sqlstate_value: 状态码,如 02000SQLWARNING: 所有以01开头的SQLSTATE代码的简写NOT FOUND: 所有以02开头的SQLSTATE代码的简写SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写drop procedure if exists p12;#---------------------举例:根据传入的参数uage,查询用户表tb_user中所有用户年龄小于等于uage的name和profession,并将这两个字段插入到新表 (id,name,profession)---------------------
create procedure p12(in user_age int)
begin# 有先后顺序:先声明普通变量,再声明游标declare namenew varchar(100);declare profnew varchar(100);# 1.声明游标 存储查询结果集declare getInfo cursor forselect name,profession from tb_user where age <= user_age;# 定义 条件处理程序,当状态码为02000时触发条件处理程序 -> 退出操作,关闭游标declare exit handler for sqlstate '02000' close getInfo;# declare exit handler for not found close getInfo;# 2.创建新表的 表结构drop table if exists tb_user_new;create table if not exists tb_user_new(id int primary key auto_increment,name varchar(100),profession varchar(100));# 3.开启游标open getInfo;# 4.获取游标查询的结果集,循环遍历# 4.1 遍历的时候把查询结果集的name和profession赋值给两个局部变量,声明两个变量while true do# 获取游标记录fetch getInfo into namenew,profnew;# 4.3 插入新表数据insert into tb_user_new values(null,namenew,profnew);end while;# 关闭游标close getInfo;
end;call p12(30);

十六、存储函数

在这里插入图片描述

CREATE FUNCTION 存储函数名称 ([ 参数列表 ])
RETURNS type [characteristic ...] # 指定返回值类型
BEGIN-- SQL语句RETURN ...; # 返回结果
END ;
#---------------------举例:计算从1累加到n的值,n为传入的参数值---------------------
create function fun1(n int)
RETURNS int deterministic
begindeclare sum int default 0;while n > 0 doset sum := sum + n;set n := n - 1;end while;return sum;
end;
select fun1(100);

十七、触发器

在这里插入图片描述
在这里插入图片描述

# 创建
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行级触发器
BEGINtrigger_stmt ;
END;
# 查看
SHOW TRIGGERS ;
# 删除
DROP TRIGGER [schema_name.]trigger_name ; 
-- 如果没有指定 schema_name,默认为当前数据库

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

acwing算法学习笔记 ------ 双链表

1、定义 这里可以做一个投机取巧&#xff0c;我们不再像单链表去用head去存头和尾&#xff0c;直接让r[0] 1,l[1] 0; idx 2.进行初始化&#xff0c; 解释一下l[N] 和 r[N] l[N]:是表示指向左面下一个节点下标&#xff0c; r[N]:表示指向下一个节点的下标。大家不用担心i…

[VNCTF2024]-PWN:shellcode_master解析(orw,用mmap代替read读文件)

查看保护 查看ida 在sandbox函数中&#xff0c;函数先使用了seccomp_init初始化&#xff0c;允许了所有系统调用&#xff0c;再用seccomp_rule_add来禁用掉了部分系统调用&#xff0c;其中包括execve和read seccomp_init函数可以进行系统调用全禁用和全允许初始化 seccomp_ru…

《高质量的C/C++编程规范》学习

目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…

python_pyecharts绘制漏斗图

python-pyecharts绘制漏斗图 from pyecharts.charts import Funnel from pyecharts import options as opts# 数据 data [("访问", 100), ("咨询", 80), ("订单", 60), ("点击", 40), ("展现", 20)]# 创建漏斗图 funnel …

uvloop,一个强大的 Python 异步IO编程库!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 什么是uvloop库&#xff1f; 安装uvloop库 使用uvloop库 uvloop库的功能特性 1. 更…

【信息提取】FindSomething 浏览器插件

下载地址 FindSomething 浏览器插件 概述 在网页的源代码或js中找到一些有趣的东西 FindSomething 用于快速在网页的html源码或js代码中提取一些有趣的信息&#xff0c;包括可能请求的资源、接口的url&#xff0c;可能请求的ip和域名&#xff0c;泄漏的证件号、手机号、邮箱…

程序员可以做什么副业呢?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

2024年云南事业单位报名流程!明天就开始报名啦,千万不要错过哦

注意啦&#xff01;注意啦&#xff01;2024年云南事业单位报名即将开始&#xff01; ▶️公告已发布&#xff0c;2月26日上午9&#xff1a;00开始报名‼️ 相关时间节点 **报名时间&#xff1a;**2024年2月26日9:00至3月1日18:00 **资格初审时间&#xff1a;**2024年2月26日…

【Python】Windows本地映射远程Linux服务器上的端口(解决jupyter notebook无法启动问题)

创作日志&#xff1a; 学习深度学习不想在本地破电脑上再安装各种软件&#xff0c;我就用实验室的服务器配置环境&#xff0c;启动jupyter notebook时脑子又瓦特了&#xff0c;在自己Windows电脑上打开服务器提供的网址&#xff0c;那肯定打不开啊&#xff0c;以前在其它电脑上…

【服务发现--service】

1、service的定义 "Service"简写"svc”。Pod不能直接提供给外网访问&#xff0c;而是应该使用service。Service就是把Pod暴露出来提供服务&#xff0c;Service才是真正的“服务”&#xff0c;它的中文名就叫“服务”。可以说Service是一个应用服务的抽象&#…

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

C++ //练习 8.9 使用你为8.1.2节(第281页)第一个练习所编写的函数打印一个istringstream对象的内容。

C Primer&#xff08;第5版&#xff09; 练习 8.9 练习 8.9 使用你为8.1.2节&#xff08;第281页&#xff09;第一个练习所编写的函数打印一个istringstream对象的内容。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*****…

NATS学习笔记(一)

NATS是什么&#xff1f; NATS是一个开源的、轻量级、高性能的消息传递系统&#xff0c;它基于发布/订阅模式&#xff0c;由Apcera公司开发和维护。 NATS的功能 发布/订阅&#xff1a;NATS的核心是一个发布/订阅消息传递系统&#xff0c;允许消息生产者发布消息到特定的主题…

制作ai语音助手

目录 一、总体介绍 二、唤醒 http://t.csdnimg.cn/3mf18 三、将语音唤醒和aiui结合 &#xff08;1&#xff09;项目合并 &#xff08;2&#xff09;修改CMakeList.txt &#xff08;3&#xff09;demo代码修改 1.添加库 2.在demo中添加唤醒功能的代码 3.尝试运行代码&am…

【数据结构和算法初阶(c语言)】数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)

1.何为数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。本质来讲就是在内存中去管理数据方式比如我们的增删查改。在内存中管理数据的方式有很多种&#xff08;比如数组结构、链式结构、树型结…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解&#xff0c;基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型&#xff0c;源代码放在GitHub上&#xff0c;地址传送点击此处。项目大纲如下&#xff1a; 文章目录 一、问题描述二、数据集处理…

智能SQL生成:后端技术与LLM的完美结合

文章目录 引言一、什么是大模型二、为什么选择LLM三、开发技术说明四、系统架构说明五、编码实战1. Maven2. 讯飞大模型配置类3. LLM相关的封装4. 编写LLM的service5. 编写controller6. 运行测试 六、总结 引言 本篇文章主要是关于实现一个类似Chat2DB的根据自然语言生成SQL的…

新改进!基于改进粒子群算法的微网/综合能源系统多目标优化调度程序代码!

适用平台&#xff1a;MatlabYalmipCplex 程序提出了一种综合考虑微电网系统运行成本和环境保护成本的并网模式下微电网多目标优化调度模型&#xff0c;采用改进的粒子群算法对优化模型进行求解。程序算例丰富、注释清晰、干货满满&#xff0c;可扩展性和创新性很高&#xff01…

readproc.h

Ubuntu22.04系统中 编译自己写的程序的时候&#xff0c;报错&#xff0c;显示找不到readproc.h文件&#xff0c;通过安装libprocps-dev解决 sudo apt install libprocps-dev

c#高级-正则表达式

正则表达式是由普通字符和元字符&#xff08;特殊符号&#xff09;组成的文字形式 应用场景 1.用于验证输入的邮箱是否合法。 2.用于验证输入的电话号码是否合法。 3.用于验证输入的身份证号码是否合法。等等 正则表达式常用的限定符总结&#xff1a; 几种常用的正则简写表达式…