⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
MySQL存储过程
- 1. 介绍
- 2. 使用
- 3. 变量
- ①系统变量
- ② 用户定义变量
- ③ 局部变量
- 4. 条件判断语句IF
- 5. 参数传递
- 6. CASE语句
- 7. 循环语句
- ①while循环
- ②repeat循环
- ③loop循环
- 8. 游标 和 条件处理程序
- ①游标 cursor
- ②条件处理程序 Handler
- ③使用案例
- 9. 存储函数
1. 介绍
存储过程
:
- 🚀什么是存储过程?
-
存储过程
是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。- 存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。
- 🚀存储过程的特点?
-
- 代码的封装,复用。
- 可以接收参数,也可以返回数据。
- 减少网络交互,提升效率。
2. 使用
存储过程的使用
:
-
🚀创建存储过程:
-
-
-- DELIMITER关键字将SQL语句结束符号改为‘$$’,在创建存储过程后再改回‘;’ -- 这是为了避免SQL语句的结束符号与END结束符号冲突,导致1064异常 DELIMITER $$CREATE PROCEDURE 存储过程名称([参数列表]) BEGIN-- SQL语句 END$$DELIMITER ;
-
-
🚀存储过程的调用:
-
-
CALL 存储过程名称([参数]);
-
-
🚀查看存储过程的信息:
-
-
-- 查询指定数据库的存储过程及状态信息 SELECT * FROM INFORMATION_SCHEMA.`ROUTINES` WHERE ROUTINE_SCHEMA = '数据库名称';-- 查询某个存储过程的定义语句 SHOW CREATE PROCEDURE 存储过程名称;
-
-
🚀删除存储过程:
-
-
DROP PROCEDURE [IF EXISTS] 存储过程名称;
-
3. 变量
①系统变量
系统变量
:
- ⚪
系统变量
:是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)
、会话变量(SESSION)
。
-
🚀查看系统变量:
-
-
#SESSION 或 GLOBAL 如果不指定,默认为SESSION -- 查看所有系统变量 SHOW [SESSION | GLOBAL] VARIABLES;-- 通过LIKE模糊匹配方式查看系统变量 SHOW [SESSION | GLOBAL] VARIABLES LIKE '....';-- 查看指定系统变量的值 SELECT @@[SESSION | GLOBAL].系统变量名;
-
-
-- 演示-- 查看所有session级别系统变量 SHOW VARIABLES; #或 SHOW SESSION VARIABLES;-- 模糊匹配AUTO开头的系统变量 SHOW SESSION VARIABLES LIKE 'AUTO%'; SHOW GLOBAL VARIABLES LIKE 'AUTO%';-- 查看名为AUTOCOMMIT的系统变量 SELECT @@GLOBAL.AUTOCOMMIT; SELECT @@SESSION.AUTOCOMMIT;
-
-
-
🚀设置系统变量
-
-
#SESSION 或 GLOBAL 如果不指定,默认为SESSION SET [SESSION | GLOBAL] 系统变量名 = 自定义值; SET @@[SESSION | GLOBAL].系统变量名 = 自定义值;
-
注意
:
- 设置或查看系统变量时,SESSION 或 GLOBAL 如果不指定,**默认为SESSION **。
- MySQL服务重新启动后,所设置的全局变量都会重置,想要不失效,可以在配置文件
/etc/my.cnf文件
中配置。
② 用户定义变量
用户定义变量
:
- ⚪
用户定义变量
:是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名
”使用就可以。其作用域为当前连接
。
-
🚀用户定义变量的赋值**(4种方式)** :
-
-
-- var_name:用户定义变量名,由用户自定义 -- expr:用户定义变量的值,由用户自定义 #方式一: SET @var_name = expr [,@var_name = expr]...; #方式二: SET @var_name := expr [,@var_name := expr]...; #方式三: SELECT @var_name := expr [,@var_name := expr]...; #方式四(将查询结果赋值给变量): SELECT 字段名 INTO @var_name FROM 表名;
-
-
🚀用户定义变量的使用:
-
-
-- var_name:用户定义变量名,由用户自定义 SELECT @var_name [,@var_name...];
-
注意
:用户定义的变量无需对其进行声明或初始化,不声明或初始化获取到的值为NULL。
③ 局部变量
局部变量
:
- ⚪
局部变量
:是根据需要定义的在局部生效的变量,访问之前,需要DECLARE
声明。可用作存储过程内的局部变量和输入参数,局部变量的范围
是在其内声明的BEGIN...END
块。
-
🚀声明局部变量:
-
-
DECLARE 变量名 变量类型 [DEFAULT...];
-
变量类型
:就是数据库字段类型:INT,BIGINT,CHAR,VARCHAR,DATE,TIME等。
-
-
🚀为局部变量赋值:
-
-
SET 变量名 = 值; SET 变量名 := 值; SELECT 字段名 INTO 变量名 FROM 表名 WHERE 查询条件...;
-
4. 条件判断语句IF
-
🚀 语法 :
-
-
IF 条件1 THEN-- 执行逻辑 ELSEIF 条件2 THEN -- 可选-- 执行逻辑 ELSE -- 可选-- 执行逻辑 END IF;
-
-
-- 演示 /* 给成绩打分 分数score >= 80 结果result就是优秀 分数80 > score >= 60 结果result就是优秀 分数score < 60 结果result就是不及格 */ DELIMITER $$CREATE PROCEDURE p3() BEGINDECLARE score INT DEFAULT 58;DECLARE result VARCHAR(10);IF score >= 80 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';END IF;SELECT result; END$$DELIMITER ;
-
-
5. 参数传递
参数
:
-
🚀参数传递的用法:
-
-
DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型]) BEGIN-- SQL语句 END$$DELIMITER ;
-
-
-- 演示 /* 1. 根据传入(in)参数score,判定当前分数对应的分数等级,并返回(out) 分数score >= 80 结果result就是优秀 分数80 > score >= 60 结果result就是优秀 分数score < 60 结果result就是不及格 */ DELIMITER $$CREATE PROCEDURE p4(IN score INT,OUT result VARCHAR(10)) BEGINIF score >= 80 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';END IF; END$$DELIMITER ;-- 调用存储过程,查看返回结果。 CALL p4(100,@result); SELECT @result;-- 2. 传入两百分制数,转换为一百分制数输出(inout) DELIMITER $$CREATE PROCEDURE p5(INOUT score DOUBLE) BEGINSET score = score * 0.5; END$$DELIMITER ;-- 设置自定参数传入,获取转换后的参数。 SET @score = 180; CALL p5(@score); SELECT @score;
-
-
6. CASE语句
-
🚀CASE语法一:
-
如果
when_value = case_value
,就会执行对应THEN后面的statement_list
逻辑 -
-
-- 存储过程中使用CASE DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型]) BEGINCASE case_valueWHEN when_value1 THEN statement_list1[WHEN when_value2 THEN statement_list2][ELSE statement_list]END CASE; END$$DELIMITER ;
-
-
🚀CASE语法二:
-
如果
search_condition
的结果为TRUE,就会执行对应THEN后面的statement_list
逻辑 -
-
-- 存储过程中使用CASE DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型]) BEGINCASEWHEN search_condition1 THEN statement_list1[WHEN search_condition2 THEN statement_list2][ELSE statement_list]END CASE; END$$DELIMITER ;
-
7. 循环语句
①while循环
while
:
-
while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:
-
-
-- 先判定条件,条件结果为TRUE则执行逻辑,否则不执行语句。 WHILE 条件 DO#SQL逻辑 END WHILE;
-
-- 存储过程中使用WHILE DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型]) BEGINWHILE 条件 DO#SQL逻辑END WHILE; END$$DELIMITER ;
-
②repeat循环
repeat
:
-
repeat是有条件的循环控制语句,当满足条件的时候退出循环 。具体语法为:
-
-
-- 先执行一次逻辑,然后判定逻辑是否为True,如果True则退出循环,不满足判定则继续循环。 REPEAT#SQL逻辑UNTIL 条件 END REPEAT;
-
-- 存储过程中使用REPEAT DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型]) BEGINREPEAT#SQL逻辑UNTIL 条件END REPEAT; END$$DELIMITER ;
-
③loop循环
loop
:
LOOP
实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。LOOP可以配合一下两个语句使用:-
LEVEL
:配合循环使用,退出循环。ITERATE
:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
-
🚀loop循环语法:
-
-
-- begin_label: 是标记 -- end_label 是结束标记 [begin_label:] LOOP#SQL逻辑 END LOOP [end_label];
-
-- 退出指定label标记的循环体 LEVEL label;-- 跳过本次循环,直接进入下一次循环 ITERATE label;
-
8. 游标 和 条件处理程序
①游标 cursor
cursor
:
游标(CURSOR)
:- 是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的
声明
、OPEN
、FETCH
和CLOSE
。
-
🚀游标的声明:
-
-
DECLARE 游标名称 CURSOR FOR 查询语句;
-
-
🚀打开游标:
-
-
OPEN 游标名称;
-
-
🚀获取游标记录:
-
-
FETCH 游标名称 INTO 变量1[,变量2,...];
-
-
🚀关闭游标:
-
-
CLOSE 游标名称;
-
②条件处理程序 Handler
Handler
:
-
条件处理程序(Handler)
: -
可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤 。具体语法为:
-
-
-- 语法 DECLARE handler_action HANDLER FOR condition_value [,condition_value,...] statement;-- handler_action的解释: CONTINUE #继续执行当前程序 EXIT #终止执行当前程序-- condition_value的解释: SQLSTATE 'lstate_value' #状态码,如02000 SQLWARNING #所有01开头的SQLSTATE代码的简写 NOT FOUND #所有02开头的SQLSTATE代码的简写 SQLEXCEPTION #所有没有被SQLWARNING或NOT FOUND捕获的代码的简写-- statement解释 /* 程序满足condition_value就会执行handler_action, 执行完handler_action操作后就会执行statement的操作 */
-
③使用案例
-
演示
: -
-
– 要求:
/*
根据传入的参数uage,来查询用户表tb_user中,
所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),
并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
*/– 逻辑:
– 1.声明游标,存储查询结果集
– 2.准备:创建表结构
– 3.开启游标
– 4.获取游标中的记录
– 5.插入数据到新表
– 6.关闭游标
-
-
-
#修改结束标志,避免代码无法正常执行完毕 DELIMITER $$CREATE PROCEDURE p11(IN uage INT) BEGIN#声明第4步使用的变量DECLARE uname VARCHAR(50);DECLARE uprofession VARCHAR(11);#1.声明游标,存储查询结果集DECLARE u_cursor CURSOR FOR SELECT NAME,profession FROM tb_user WHERE age <= uage;#声明条件处理程序Handler,#满足NOT FOUND就执行exit操作#执行完后,关闭游标:CLOSE u_cursor。-- 这个handler的目的是:若游标内没有数据,直接退出并关闭游标DECLARE EXIT HANDLER FOR NOT FOUND CLOSE u_cursor;#2.准备:创建表结构DROP TABLE IF EXISTS tb_user_pro;CREATE TABLE IF NOT EXISTS tb_user_pro(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(50) NOT NULL,profession VARCHAR(11));#3.开启游标OPEN u_cursor;#4.获取游标中的记录(循环)WHILE TRUE DO#获取游标数据存入变量FETCH u_cursor INTO uname,uprofession;#5.插入数据到新表INSERT INTO tb_user_pro VALUES(NULL,uname,uprofession);END WHILE;#6.关闭游标CLOSE u_cursor; END$$#恢复原本的结束标志 DELIMITER ; -- 调用存储过程 CALL P11(60); -- 查看是新表否达到要求 SELECT * FROM tb_user_pro;
-
9. 存储函数
存储函数
:
- 存储函数是有返回值的存储过程,存储函数的参数只能是IN类型。
-
🚀存储函数的使用:
-
-
-- 语法: DELIMITER $$CREATE FUNCTION 存储函数名称([参数列表]) RETURNS type [characteristic...] BEGIN-- SQL语句RETURN...; END $$DELIMITER ;#######################################-- characteristic的解释: DETERMINISTIC #相同的输入参数总是产生相同的结果 NO SQL #不包含SQL语句 READS SQL DATA #包含读取数据的语句,但不包含写入数据的语句。
-
-
演示
: -
-
使用存储函数,实现从1到n的累加
-
-
-
-- 使用存储函数,实现从1到n的累加 DELIMITER $$CREATE FUNCTION f(n INT) RETURNS INT DETERMINISTIC BEGIN-- SQL语句DECLARE total INT DEFAULT 0;WHILE n > 0 DOSET total = total + n;SET n = n - 1;END WHILE;-- 返回RETURN total; END $$DELIMITER ;-- 验证结果 SELECT f(100);
-
相关文章:

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…...

使用SpringBoot进行游戏服务器开发
背景: 之前一直只考虑用JavaSe进行游戏服务器开发,目前项目使用了Spring,发现还是非常好的,好处如下: 好处1:依赖注入非常方便,我们只使用Spring最基本的功能即可,这样子就算是有一些模块不使用Spring管理…...

数据结构——树状数组
文章目录 前言问题引入问题分析树状数组lowbit树状数组特性初始化一个树状数组更新操作前缀和计算区间查询 总结 前言 原题的连接 最近刷leetcode的每日一题的时候,遇到了一个区间查询的问题,使用了一种特殊的数据结构树状数组,学习完之后我…...

Untiy 使用RotateAround()方法实现物体围绕某个点或者某个物体旋转
Untiy 实现物体围绕指定点或者某个物体旋转,可使用RotateAround()方法。 语法: public void RotateAround(Vector3 point, Vector3 axis, float angle); 其中,point:旋转中心点位置; axis:要围绕的轴,如x,y,z angel…...

图像分类(五) 全面解读复现ResNet
解读 Abstract—摘要 翻译 更深的神经网络往往更难以训练,我们在此提出一个残差学习的框架,以减轻网络的训练负担,这是个比以往的网络要深的多的网络。我们明确地将层作为输入学习残差函数,而不是学习未知的函数。我们提供了非…...

使用html2canvas转换table为图片时合并单元格rowspan失效,无边框显示问题解决(React实现)
最近使用 html2canvas导出Table表单为图片,但是转换出的图片被合并的单元格没有显示边框 查了原因是因为我为tr设置了背景色,然后td设置了rowspan,设置了rowspan的单元格就会出现边框不显示的问题。 解决方法就是取消tr的背景色,然…...

pandas教程:Time Series Basics 时间序列基础
文章目录 11.2 Time Series Basics(时间序列基础)1 Indexing, Selection, Subsetting(索引,选择,取子集)2 Time Series with Duplicate Indices(重复索引的时间序列) 11.2 Time Seri…...

【C++初阶】STL详解(四)vector的模拟实现
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...

Zookeeper学习笔记(2)—— Zookeeper API简单操作
前置知识:Zookeeper学习笔记(1)—— 基础知识-CSDN博客 Zookeeper集群搭建部分 前提:保证zookeeper集群处于启动状态 环境搭建 依赖配置 <dependencies><dependency><groupId>junit</groupId><arti…...

YOLOv8-Seg改进:Backbone改进 |Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构
🚀🚀🚀本文改进:Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构,包括nextvit_small, nextvit_base, nextvit_large,相比较yolov8-seg各个版本如下: layersparametersgradientsGFLOPsnextvit_small61033841075...

DocCMS keyword SQL注入漏洞复现 [附POC]
文章目录 DocCMS keyword SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 DocCMS keyword SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测…...

利用(Transfer Learning)迁移学习在IMDB数据上训练一个文本分类模型
1. 背景 有些场景下,开始的时候数据量很小,如果我们用一个几千条数据训练一个全新的深度机器学习的文本分类模型,效果不会很好。这个时候你有两种选择,1.用传统的机器学习训练,2.利用迁移学习在一个预训练的模型上训练…...

pom.xml格式化快捷键
在软件开发和编程领域,"格式化"通常指的是将代码按照一定的规范和风格进行排列,以提高代码的可读性和维护性。格式化代码有助于使代码结构清晰、统一,并符合特定的编码规范。 格式化可以包括以下方面: 缩进:…...

【短文】【踩坑】可以在Qt Designer给QTableWidge添加右键菜单吗?
2023年11月18日,周六上午 今天早上在网上找了好久都没找到教怎么在Qt Designer给QTableWidge添加右键菜单的文章 答案是:不可以 在Qt Designer中无法直接为QTableWidget添加右键菜单。 Qt Designer主要用于创建界面布局和设计,无法直接添加…...

Git常用配置
git log 美化输出 全局配置参数 git config --global alias.lm "log --no-merges --color --dateformat:%Y-%m-%d %H:%M:%S --authorghost --prettyformat:%Cred%h%Creset - %Cgreen(%cd)%C(yellow)%d%Cblue %s %C(bold blue)<%an>%Creset --abbrev-commit"…...

力扣每日一题-数位和相等数对的最大和-2023.11.18
力扣每日一题:数位和相等数对的最大和 开篇 这道每日一题还是挺需要思考的,我绕晕了好久,根据题解的提示才写出来。 题目链接:2342.数位和相等数对的最大和 题目描述 代码思路 1.创建一个数组存储每个数位的数的最大值,创建一…...

【win32_001】win32命名规、缩写、窗口
整数类型 bool类型 使用注意: 一般bool 的false0;true1 | 2 | …|n false是为0,true是非零 不建议这样用: if (result TRUE) // Wrong! 因为result不一定只返回1(true),当返回2时,…...

机器学习第8天:SVM分类
文章目录 机器学习专栏 介绍 特征缩放 示例代码 硬间隔与软间隔分类 主要代码 代码解释 非线性SVM分类 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 介绍 作用:判别种类 原理:找出一个决策边界,判断数据所处区域来识别种类 简单…...

AI工具合集
网站:未来百科 | 为发现全球优质AI工具产品而生 (6aiq.com) 如今,AI技术涉及到了很多领域,比如去水印、一键抠图、图像处理、AI图像生成等等。站长之家之前也分享过一些,但是在网上要搜索找到它们还是费一些功夫。 今天发现了一…...

代码随想录算法训练营Day 54 || 392.判断子序列、115.不同的子序列
392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,&quo…...

C 语言 gets()和puts()
C 语言 gets()和puts() gets()和puts()在头文件stdio.h中声明。这两个函数用于字符串的输入/输出操作。 C gets()函数 gets()函数使用户可以输入一些字符,然后按Enter键。 用户输入的所有字符都存储在字符数组中。 空字符将添加到数组以使其成为字符串。 gets()允…...

核—幂零分解
若向量空间 V \mathcal V V存在子空间 X \mathcal X X与 Y \mathcal Y Y,当 X Y V X ∩ Y 0 \mathcal {X\text{}Y\text{}V}\\ \mathcal {X}\cap \mathcal {Y}0 XYVX∩Y0 时称子空间 X \mathcal X X与 Y \mathcal Y Y是完备的,其中记为 X ⊕ Y V \ma…...

轻松掌控财务,分析账户花销,明细记录支出情况
随着科技的发展,我们的生活变得越来越智能化。然而,对于许多忙碌的现代人来说,管理财务可能是一件令人头疼的事情。复杂的账单、花销、收入,这些可能会让你感到无从下手。但现在,我们有一个全新的解决方案——一款全新…...

竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python
文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …...

11. Spring源码篇之实例化前的后置处理器
简介 spring在创建Bean的过程中,提供了很多个生命周期,实例化前就是比较早的一个生命周期,顾名思义就是在Bean被实例化之前的处理,这个时候还没实例化,只能拿到该Bean的Class对象,如果在这个时候直接返回一…...

Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求
版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录HTTP协议1、网址1.1 网址的概念1.2 URL的组成1.3 知识要点 2、HTTP协议的介绍2.1 HTTP协议的概念及作用2.2 HTTP协议的概念及作用2.3 浏览器访问Web服务器的过程 3、HTTP请求报文3.1 H…...

P1304 哥德巴赫猜想
题目描述 输入一个偶数 N,验证 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 22 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 1010,10=3+7=5+510=3+7=5+5,则 10=5+510=5+5 是错误答案。 输入格式 第一行输入一个…...

CSDN每日一题学习训练——Python版(搜索插入位置、最大子序和)
版本说明 当前版本号[20231118]。 版本修改说明20231118初版 目录 文章目录 版本说明目录搜索插入位置题目解题思路代码思路参考代码 最大子序和题目解题思路代码思路参考代码 搜索插入位置 题目 给定一个排序数组和一个目标值,在数组中找到目标值,…...

Java在物联网中的重要性
【点我-这里送书】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(…...

动态规划解背包问题
题目 题解 def knapsac(W: int, N: int, wt: List[int], val: List[int]) -> int:# 定义状态动作价值函数: dp[i][j],对于前i个物品,当前背包容量为j,最大的可装载价值dp [[0 for j in range(W1)] for i in range(N1)]# 状态动作转移for…...