【MySQL进阶】视图 存储过程 触发器
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。
🎉🎉个人主页🎉🎉 : 南瓜籽的主页
✨✨座右铭✨✨ : 坚持到底,决不放弃,是成功的保证,只要你不放弃,你就有机会,只要放弃的人,他肯定是不会成功的人。
🍎🍎视图🍎🍎
视图(View)
是一种虚拟存在的表
。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
注: 对视图的增删改操作最终会操作原表。
🍎🍎视图语法🍎🍎
1. 视图创建
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [
CASCADED | LOCAL ] CHECK OPTION ]
2. 视图查询
查看创建视图语句:SHOW CREATE VIEW 视图名称;
查看视图数据:SELECT * FROM 视图名称 ...... ;
3. 视图修改
方式一:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH
[ CASCADED | LOCAL ] CHECK OPTION ]
方式二:ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED |
LOCAL ] CHECK OPTION ]
4. 视图删除
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...
案例演示:
– 创建视图
create or replace view user_v_1 as select id,name from tb_user where id <= 10;
– 查询视图
show create view user_v_1;
select * from user_v_1;
select * from user_v_1 where id < 3;
– 修改视图
create or replace view user_v_1 as select id,name,profession from tb_user where id <= 10;
alter view user_v_1 as select id,name from tb_user where id <= 10;
– 删除视图
drop view if exists user_v_1;
🍎🍎检查选项🍎🍎
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。
MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADED 和 LOCAL,默认值为 CASCADED 。
1. CASCADED 级联
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。
2. LOCAL 本地
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创
建时未指定检查选项。 则在执行检查时,只会检查v2,不会检查v2的关联视图v1。
注: 如果此时v1视图也指定了检查选项,则在执行检查时,不仅会检查v2,还会检查 v1。
🍎🍎视图更新🍎🍎
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- UNION 或者 UNION ALL
案例演示:
create view stu_v_count as select count(*) from student;
上述的视图中,就只有一个单行单列的数据,如果我们对这个视图进行更新或插入的,将会报错。
insert into stu_v_count values(10);
注: 这里同样可以证明对视图的增加操作会直接影响到原表!
🍎🍎视图作用🍎🍎
1. 简单
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
2. 安全
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据
create view stu_v_count as select count(*) from student;
insert into stu_v_count values(10);
3. 数据独立
视图可帮助用户屏蔽真实表结构变化带来的影响。
🍉🍉存储过程🍉🍉
存储过程
是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用
特点:
- 封装,复用 可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可。
- 可以接收参数,也可以返回数据 再存储过程中,可以传递参数,也可以接收返回
值。- 减少网络交互,效率提升 如果涉及到多条SQL,每执行一次都是一次网络传输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。
🍉🍉存储过程语法🍉🍉
1. 创建存储过程
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ])
BEGIN
-- SQL语句
END ;
2. 调用存储过程
CALL 名称 ([ 参数 ]);
如果所要调用的存储过程是无参的,括号() 可省略
3. 查看存储过程
-- 查询指定数据库的存储过程及状态信息
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx';
-- 查询某个存储过程的定义
SHOW CREATE PROCEDURE 存储过程名称 ;
4. 删除存储过程
DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;
注: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的
结束符。
案例演示:
-- 存储过程基本语法
-- 创建
create procedure p1()
begin
select count(*) from tb_user;
end;
-- 调用
call p1();
-- 查看
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'mysql_test';
show create procedure p1;
-- 删除
drop procedure if exists p1;
🍉🍉变量🍉🍉
在MySQL中变量分为三种类型:
系统变量
、用户定义变量
、局部变量
。
🍉🍉系统变量🍉🍉
系统变量
是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。
1. 查看系统变量
-- 查看所有系统变量
SHOW [ SESSION | GLOBAL ] VARIABLES ;
-- 可以通过LIKE模糊匹配方式查找变量
SHOW [ SESSION | GLOBAL ] VARIABLES LIKE '......';
-- 查看指定变量的值
SELECT @@[SESSION | GLOBAL] 系统变量名;
2. 设置系统变量
SET [ SESSION | GLOBAL ] 系统变量名 = 值 ;
SET @@[SESSION | GLOBAL]系统变量名 = 值 ;
注:
如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量。
- 全局变量(GLOBAL): 全局变量针对于所有的会话。
- 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了
mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在
/etc/my.cnf
中配置。
案例演示:
-- 查看系统变量
show session variables ;
show session variables like 'auto%';
show global variables like 'auto%';
select @@global.autocommit;
select @@session.autocommit;
-- 设置系统变量
set session autocommit = 1;
insert into course(id, name) VALUES (6, 'ES');
set global autocommit = 0;
select @@global.autocommit;
🍉🍉用户自定义变量🍉🍉
用户定义变量
是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接。
1. 赋值
方式一:
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 表名;
2. 使用
SELECT @var_name ;
注: 用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL。
案例演示:
-- 赋值
set @myname = 'pumpkin';
set @myage := 10;
set @mygender := '男',@myhobby := 'Java';
select @mycolor := 'red';
select count(*) into @mycount from tb_user;
-- 使用
select @myname,@myage,@mygender,@myhobby;
select @mycolor , @mycount;
select @abc; abc没有定义,结果返回NULL
🍉🍉局部变量🍉🍉
局部变量
是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块。
1. 声明
DECLARE 变量名 变量类型 [DEFAULT ... ] ;
-- 变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等。
2. 赋值
SET 变量名 = 值 ;
SET 变量名 := 值 ;
SELECT 字段名 INTO 变量名 FROM 表名 ... ;
案例演示:
-- 声明局部变量 - declare
-- 赋值
create procedure p2()
begin
declare stu_count int default 0;
select count(*) into stu_count from student;
select stu_count;
end;
call p2();
🍉🍉常用函数及用法🍉🍉
🍉🍉 if🍉🍉
语法:
IF 条件1 THEN
.....
ELSEIF 条件2 THEN -- 可选
.....
ELSE -- 可选
.....
END IF;
在if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有。 ELSE结构可以有,也可以没有。
案例演示:
根据定义的分数score变量,判定当前分数对应的分数等级。
score >= 85分,等级为优秀。
score >= 60分 且 score < 85分,等级为及格。
score < 60分,等级为不及格。
create procedure p3()
begindeclare score int default 65;declare result varchar(10);
if score >= 85 thenset result := '优秀';
elseif score >= 60 thenset result := '及格';
elseset result := '不及格';
end if;select result;
end;call p3();
🍉🍉 参数🍉🍉
参数的类型,主要分为以下三种:
IN
、OUT
、INOUT
。
语法:
CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ])
BEGIN
-- SQL语句
END ;
案例演示:
依然是上述案例,此时我们需要传入参数
create procedure p4(in score int, out result varchar(10))
beginif score >= 85 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';
end if;
end;call p4(56);
🍉🍉 case🍉🍉
case
结构及作用,和流程控制函数很类似。有两种语法格式。
语法一:
-- 含义: 当case_value的值为 when_value1时,执行statement_list1,当值为 when_value2时,
执行statement_list2, 否则就执行 statement_list
CASE case_value
WHEN when_value1 THEN statement_list1
[ WHEN when_value2 THEN statement_list2] ...
[ ELSE statement_list ]
END CASE;
语法二:
-- 含义: 当条件search_condition1成立时,执行statement_list1,当条件search_condition2成
立时,执行statement_list2, 否则就执行 statement_list
CASE
WHEN search_condition1 THEN statement_list1
[WHEN search_condition2 THEN statement_list2] ...
[ELSE statement_list]
END CASE;
案例演示:
根据传入的月份,判定月份所属的季节(要求采用case结构)。
1-3月份,为第一季度
4-6月份,为第二季度
7-9月份,为第三季度
10-12月份,为第四季度
create procedure p6(in month int)
begindeclare result varchar(10);
casewhen month >= 1 and month <= 3 thenset result := '第一季度';when month >= 4 and month <= 6 thenset result := '第二季度';when month >= 7 and month <= 9 thenset result := '第三季度';when month >= 10 and month <= 12 thenset result := '第四季度';elseset result := '非法参数';
end case ;
select concat('您输入的月份为: ',month, ', 所属的季度为: ',result);
end;call p6(16);
注: 如果判定条件有多个,多个条件之间,可以使用 and 或 or 进行连接。
🍉🍉 while🍉🍉
while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。
-- 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE 条件 DO
SQL逻辑...
END WHILE;
案例演示:
计算从1累加到n的值,n为传入的参数值。
create procedure p7(in num int)
begin
declare sum int default 0;while num > 0 doset sum:= sum+ num;set num := num - 1;
end while;
select sum;
end;call p7(5);
🍉🍉 repeat🍉🍉
repeat
是有条件的循环控制语句, 当满足until声明的条件的时候,则退出循环。
-- 先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环
REPEAT
SQL逻辑...
UNTIL 条件
END REPEAT;
案例演示:
同样是上述案例,但是用repeat写
create procedure p8(in num int)
begin
declare sum int default 0;
repeatset sum:= sum + num ;set num := num - 1;
until num <= 0
end repeat;
select sum;
end;call p8(10);
🍉🍉 loop🍉🍉
LOOP
实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。
LOOP可以配合一下两个语句使用:
- LEAVE :配合循环使用,退出循环。
- ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
[begin_label:] LOOP
SQL逻辑...
END LOOP [end_label];LEAVE label; -- 退出指定标记的循环体
ITERATE label; -- 直接进入下一次循环
案例演示:
计算从1累加到n的值,n为传入的参数值。
create procedure p9(in num int)
begin
declare sum int default 0;
label1:loop
if num <=0 thenleave label1;
end if;set sum := sum + num ;set num := num - 1;
end loop label1;
select sum ;
end;call p9(5);
🍉🍉 游标🍉🍉
游标(CURSOR)
是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH 和 CLOSE。
1. 声明游标
DECLARE 游标名称 CURSOR FOR 查询语句 ;
2. 打开游标
OPEN 游标名称 ;
3. 获取游标记录
FETCH 游标名称 INTO 变量 [, 变量 ] ;
4. 关闭游标
CLOSE 游标名称 ;
案例演示:
根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名
(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表
(id,name,profession)中。
CREATE PROCEDURE p10(IN uage INT)
BEGINDECLARE uname VARCHAR(100);DECLARE upro VARCHAR(100);DECLARE user_cursor CURSOR FOR SELECT `name`,profession FROM tb_user WHERE age <= uage;DROP TABLE IF EXISTS tb_user_pro;CREATE TABLE tb_user_pro(id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(100),profession VARCHAR(100));-- 打开游标OPEN user_cursor;WHILE TRUE DO-- 获取数据并保存到 uname,upro中FETCH user_cursor INTO uname,upro;INSERT INTO tb_user_pro VALUES(null,uname,upro);
END WHILE;-- 关闭游标CLOSE user_cursor;
END;CALL p10(30);
❗❗ 注: 此时我们调用过程中会报错,之所以报错是因为上面的while循环中,并没有退出条件。
当游标的数据集获取完毕之后,再次获取数据,就会报错,从而终止了程序的执行。
但是此时,tb_user_pro表结构及其数据都已经插入成功了
此时如果想解决这个问题,我们需要要通过MySQL中提供的 条件处理程序 Handler
来解决。
🍉🍉 条件处理程序🍉🍉
条件处理程序(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代码的简写
案例完善:
CREATE PROCEDURE p10(IN uage INT)
BEGINDECLARE uname VARCHAR(100);DECLARE upro VARCHAR(100);DECLARE user_cursor CURSOR FOR SELECT `name`,profession FROM tb_user WHERE age <= uage;-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出DECLARE EXIT HANDLER for SQLSTATE '02000' CLOSE u_cursor;DROP TABLE IF EXISTS tb_user_pro;CREATE TABLE tb_user_pro(id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(100),profession VARCHAR(100));-- 打开游标OPEN user_cursor;WHILE TRUE DO-- 获取数据并保存到 uname,upro中FETCH user_cursor INTO uname,upro;INSERT INTO tb_user_pro VALUES(null,uname,upro);
END WHILE;-- 关闭游标CLOSE user_cursor;
END;CALL p10(30);
注: 游标的声明需要在局部变量定义之后
🍉🍉 存储函数🍉🍉
存储函数
是有返回值
(且必须有返回值
)的存储过程,存储函数的参数只能是IN类型的。
CREATE FUNCTION 存储函数名称 ([ 参数列表 ])
RETURNS type [characteristic ...]
BEGIN
-- SQL语句
RETURN ...;
END ;
characteristic说明:
- DETERMINISTIC:相同的输入参数总是产生相同的结果。
- NO SQL :不包含 SQL 语句。
- READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。
案例演示:
计算从1累加到n的值,n为传入的参数值。
create function fun1(n int)
returns int deterministic
begin
declare total int default 0;while n>0 doset total := total + n;set n := n - 1;
end while;
return total;
end;select fun1(50);
注: 在mysql8.0版本中binlog默认是开启的,一旦开启了,mysql就要求在定义存储过程时,需要指定characteristic特性,否则就会报如下错误:
🍊🍊触发器🍊🍊
触发器
是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触
发并执行触发器中定义的SQL语句集合。
触发器的这种特性可以协助应用在数据库端确保数据的完整性
,日志记录
,数据校验
等操作 。
使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。
现在触发器还只支持行级触发,不支持语句级触发
。
🍊🍊触发器语法🍊🍊
1. 创建
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行级触发器
BEGIN
trigger_stmt ;
END;
2. 查看触发器
SHOW TRIGGERS ;
3. 删除触发器
DROP TRIGGER [schema_name.]trigger_name ; -- 如果没有指定 schema_name,默认为当前数
据库 。
🍊🍊案例演示🍊🍊
通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中, 包含增加,
修改 , 删除 ;
表结构准备:
-- 准备工作 : 日志表 user_logs
create table user_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;
1. 插入触发器
create trigger tb_user_insert_triggerafter insert on tb_user for each row
begininsert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'insert', now(), new.id, concat('插入的数据内容为:
id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ',
profession=', NEW.profession));
end;
2. 修改数据触发器
create trigger tb_user_update_triggerafter update on tb_user for each row
begininsert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'update', now(), new.id,
concat('更新之前的数据: id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession,
' | 更新之后的数据: id=',new.id,',name=',new.name, ', phone=',
NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
end;
3. 删除触发器
create trigger tb_user_delete_triggerafter delete on tb_user for each row
begininsert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'delete', now(), old.id,
concat('删除之前的数据: id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession));
end;
相关文章:
【MySQL进阶】视图 存储过程 触发器
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...
[Linux篇] Linux常见命令和权限
文章目录使用XShell登录Linux1.Linux常用基本命令:1.1 ls(列出当前的目录下都有哪些文件和目录)1.2 cd (change directory 切换目录)1.3 pwd(查看当前目录的绝对路径)1.4 touch(创建文件)1.5 ca…...
29岁从事功能测试被辞,面试2个月都找不到工作吗?
最近一个28岁老同学联系我,因为被公司辞退,找我倾诉,于是写下此文。 他是14年二本毕业,在我的印象里人特别懒,不爱学习,专业不好,毕业前因为都没找到合适工作,直接去创业了…...
【C#个人错题笔记1】
观前提醒 记录一些我不会或者少见的内容,不一定适合所有人 字符串拼接 int a3,b8; Console.WriteLine(ab);//11 Console.WriteLine("ab");//ab Console.WriteLine(a""b);//38 Console.WriteLine("ab"ab);//ab38 Console.WriteLine…...
基于lambda的mongodb查询插件
需求背景需要一个像mybatis plus 一样的基于lambda, 且面向对象的查询mongo数据的插件。在网上找了很久,没有发现有类似功能的插件。于是自己手写了一个,借助mongoTemplate屏蔽了底层查询语句的实现细节。在此基础上,实现了查询的统一封装。技…...
基于微信小程序的微信社团小程序
文末联系获取源码 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器…...
GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像
我们使用GEE在线编辑可以直接通过在线的网页可以加载展示我们计算的结果,而python版的GEE要展示我们的计算结果可能就比较麻烦。如果有同学看过GEE的python版API中可以找到一个类ee.mapclient,这个类的介绍是它是GEE官方通过Tk写的一个加载展示地图的类。…...
PGLBox全面解决图训练速度、成本、稳定性、复杂算法四大问题!
图神经网络(Graph Neural Network,GNN)是近年来出现的一种利用深度学习直接对图结构数据进行学习的方法,通过在图中的节点和边上制定聚合的策略,GNN能够学习到图结构数据中节点以及边内在规律和更加深层次的语义特征。…...
超详细的 pytest 教程(一)使用入门篇
前言 pytest到目前为止还没有翻译的比较好全面的使用文档,很多英文不太好的小伙伴,在学习时看英文文档还是很吃力。本来去年就计划写pytest详细的使用文档的,由于时间关系一直搁置,直到今天才开始写。本文是第一篇,主…...
二叉树理论基础知识点
二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这…...
【算法基础】堆⭐⭐⭐
一、堆 1. 堆的概念 堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: (1)堆中某个结点的值总是不大于或不小于其父结点的值; (2)堆总是一棵完全二叉树。 将根结点最大的堆叫做最大堆或大根堆,根结点…...
时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测
时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测 目录时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 CNN-SVM预测模型将深度学习模型作为特征学习器,将SVM 支持向量机 作为训练器进行…...
【TypeScrip】TypeScrip的任意类型(Any 类型 和 unknown 顶级类型):
文章目录一、安转依赖:【1】nodejs 环境执行ts【2】使用ts-node二、Any 类型 和 unknown 顶级类型【1】没有强制限定哪种类型,随时切换类型都可以 我们可以对 any 进行任何操作,不需要检查类型【2】声明变量的时候没有指定任意类型默认为any【…...
智能洗地机什么牌子好?智能洗地机排行
要说家庭清洁热门的产品,洗地机肯定首当其冲,集洗吸拖为一体的清洁工具,省时又省力,可谓是家里清洁好助手,今天笔者就为大家介绍几款重量轻、噪音轻、拖地干净的洗地机! 一、CEYEE希亦T800洗地机 在国内,洗…...
【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)
文章目录今日任务1.链表理论基础(1)什么是链表?(2)链表的类型(3)链表的存储方式(4)链表的定义(5)链表的操作(6)性能分析2.…...
山东大学软件学院面向对象简答题整理【个人向】
面向对象简答题整理【个人向】 0.试用面向对象语言简述改写和重定义的异同,以及方法绑定时的差别 改写是子类的方法和父类的方法具有相同的方法名和类型签名重定义是子类的方法和父类的方法方法名相同但类型签名不同在方法绑定时,改写是动态绑定&#…...
JAVA时间类及JAVA8新时间类
文章目录Java旧时间类关系图![在这里插入图片描述](https://img-blog.csdnimg.cn/e2c2c26c841e40bdb9cc85d0fc4bc1df.png)GMT、时间戳、统一标准时间、时区Java时间类创建时间类示例java.text.DateFormat时间格式转换java.util.Calendar总结Java时间类Java8新时间类InstantCloc…...
ASEMI代理FGH60N60SFD,安森美FGH60N60SFD原装IGBT
编辑-Z 安森美FGH60N60SFD原装IGBT参数: 型号:FGH60N60SFD 集电极到发射极电压(VCES):600V 栅极到发射极电压(VGES):20V 收集器电流(IC):120…...
【云原生之Docker实战】使用dokcer部署web端vscode
【云原生之Docker实战】使用dokcer部署web端vscode 一、vscode-server介绍二、检查本地docke环境1.检查系统版本2.检查docker版本3.检查docker状态三、下载vscode镜像四、部署vscode-server1.创建安装目录2.创建vscode容器3.查看vscode容器状态4.查看vscode容器日志五、访问vsc…...
Docker安装Tomcat、mysql、redis
目录 前言 一、安装Tomcat 二、安装mysql (一)简单版 (二)实战版 三、安装redis 前言 镜像可以先去Docker Hub Container Image Library | App Containerization 左上角搜,然后点进入可以看到具体的命令&#…...
【python 基础篇 八】python的常用数据类型操作-------集合
目录1.集合的基本概念2.集合的定义2.1 可变集合 set定义2.2 不可变集合 fronzenset 定义2.3 集合定义的注意事项3.单一集合的常用操作4. 集合之间操作4.1 交集4.2 并集4.3 差集4.4 判定1.集合的基本概念 无序的,不可随机访问的,不可重复的元素集合与数学…...
Spring框架中问题补充
BeanFactory 和 ApplicationContext BeanFactory和ApplicationContext是接口。BeanFactory接口时spring框架的顶层接口,定义管理bean的最基本的方法,例如获取实例、判断等功能。 DefaultListableBeanFactory实现BeanFactory 接口,是主要的创建bean的工…...
【Leedcode】顺序表必备的三道面试题(附图解)
顺序表必备的三道面试题(附图解) 文章目录顺序表必备的三道面试题(附图解)前言一、第一题1.题目2.思路图解3.源码二、第二题1.题目2.思路图解3.源码三、第三题1.题目2.思路图解3.源码总结前言 本文给大家介绍三道顺序表学习过程中…...
SOFA Weekly|开源人、本周贡献 issue 精选
SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&#…...
2023美赛 ICM E题详细版思路
问题E:光污染注:楷体为题目原文,宋体为思路部分首先,我们需要考虑的就是美赛ABEF的核心问题,数据。这里E题是以光污染为背景的题目,首当其冲的我们就需要收集一些数据以支撑我们的模型。对于E题提出的问题&…...
【LeetCode】剑指 Offer(3)
目录 写在前面: 题目:剑指 Offer 09. 用两个栈实现队列 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 写在前面&…...
springboot simple (13) springboot Elasticsearch(Elasticsearch8.5.1)
这里首先简单的介绍了Elasticsearch,然后实现了springboot集成Elasticsearch。 版本: Elasticsearch:v8.5.1 Kibana:v8.5.1 springboot集成elasticsearch有两种方式。 1)rest客户端RestHingLevelClient; …...
《爆肝整理》保姆级系列教程python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
简介 有些 post 的请求参数是 json 格式的,这个前面发送post 请求里面提到过,需要导入 json模块处理。现在企业公司一般常见的接口因为json数据容易处理,所以绝大多数返回数据也是 json 格式的,我们在做判断时候,往往只…...
分享111个HTML旅游交通模板,总有一款适合您
分享111个HTML旅游交通模板,总有一款适合您 111个HTML旅游交通模板下载链接:https://pan.baidu.com/s/1VHJSBVJbj4PQpPAwxysJBg?pwd8b17 提取码:8b17 Python采集代码下载链接:采集代码.zip - 蓝奏云 汽车租赁平台网页模板 汽…...
guava中ImmutableList使用示例详解
ImmutableList是一个不可变、线程安全的列表集合,它只会获取传入对象的一个副本,而不会影响到原来的变量或者对象,如下代码: int a 23;ImmutableList<Integer> list ImmutableList.of(a, 12);System.out.println(list);a …...
如何替换网站的图片/企业如何注册自己的网站
摘要之前我们讲了如何求梯度, 如何使用Pytorch求解梯度. 这里我们介绍梯度下降法, 用一个例子, 介绍如何优化参数.简介上一篇我们计算得到了各个系数(w1和w2)的梯度, 这一篇我们介绍梯度下降法, 来优化这些系数. 这一篇主要有以下几个部分:梯度下降法的简单介绍;手动实现梯度下…...
昆山苏州网站建设/免费发布产品信息的网站
网易考拉(以下简称考拉)是网易旗下以跨境业务为主的综合型电商,自2015年1月9日上线公测后,业务保持了高速增长,这背后离不开其技术团队的支撑。微服务化是电商IT架构演化的必然趋势,网易考拉的服务架构演进…...
手機如何做网站/cms自助建站系统
实验目录1.继承2.面向抽象编程13.面向抽象编程24.子类方法重写5.面向抽象编程6.接口本次作业共六题,一共五个包,包名即题号,其中第二题和第三题都写在第二题的包中。1.继承 在一个源程序中,定义四个类: 第一个类是图形…...
网站系统建设管理制度/网站搭建步骤
1. JS为什么是单线程的? JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。 那么现在有2个进程,process1 process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作。 p…...
滁州做网站优化/百度投放广告收费标准
在本文中,我们会研究一些用于数据科学任务的 Python 库,而不是常见的比如 panda、scikit-learn 和 matplotlib 等的库。尽管像 panda 和 scikit-learn 这样的库,是在机器学习任务中经常出现的,但是了解这个领域中的其它 Python 产…...
做网站的诈骗8000块钱犯法吗/合肥网站优化方案
在一个目录下的搜索,即FindElem()不分先后出现顺序。 (一) 先讲一下XML中的物殊字符,手动填写时注意一下。 字符 字符实体& &或#38; &apos…...