MySQL强化关键_015_存储过程

目  录

一、概述

1.说明

2.优点

3.缺点 

二、存储过程的操作

1.创建

2.调用

3.查看

4.删除

三、变量

1.系统变量

(1)说明

(2)查看系统变量 

(3)设置系统变量

2.用户变量

(1)说明

(2)用户变量赋值

(3)读取用户变量

 3.局部变量

(1)说明

(2)声明、赋值、读取与调用

 四、IF

1.语法格式

2.实例

五、参数

1.三种类型

2.in、out 实例 

3.inout 实例

 六、CASE

1.语法格式1

2.语法格式2

3.实例

七、循环

1.WHILE 循环

(1)语法格式

(2)实例

2.REPEAT 循环

(1)语法格式

(2)实例 

3. LOOP 循环

(1)语法格式

(2)leave 实例 

(3)iterate 实例

八、游标 cursor

1.说明

2.步骤

(1)声明

(2)开启

(3)获取

(4)关闭

3.实例 

 九、捕捉并处理异常

1.说明

2.实例 

十、存储函数

1.说明

2.语法格式

3.实例

十一、触发器

1.说明

2.语法规则 

3.关键字 new、old

4.实例


一、概述

1.说明

  1. 存储过程即过程化 SQL 语言,是在普通 SQL 语句上增加了编程语言的特点,将 DML 和 DQL 组织在过程化代码中,通过逻辑判断、循环等实现复杂计算的程序语言;
  2. 存储过程有自己的变量、条件判断、循环语句等,一个存储过程中,可以将多条 SQL 语句以逻辑代码的方式将其串联,所以一个存储过程可以看作是为了完成特定任务的 SQL 语句集合;
  3. 每一个存储过程就是一个数据库对象,和 table、view一样存储在数据库当中,一次编译永久有效。每个存储过程都有自己的名称,可以通过存储过程的名称调用;
  4. 在数据量庞大的情况下,利用存储过程可以提升效率;
  5. 实际开发中,只有在需要进行性能优化时考虑使用。

2.优点

        速度快。降低了应用服务器和数据库服务器之间的网络通讯开销。


3.缺点 

        移植性差、编写难度大、维护性差。每一个数据库管理系统都有独特的存储过程语法规则,一旦使用了存储过程,较难更换数据库产品。且对于数据库存储过程语法,没有专业的 IDE,编码效率较低,维护成本较高。


二、存储过程的操作

# 为了演示存储过程的一系列操作,首先初始化
drop table if exists human;
create table human(id int not null auto_increment,name varchar(10),gender char(2) default '未知',age int,phone varchar(20),primary key (id)
);
insert into human(name, gender, age, phone) values('王磊', '男', 18, '13328345217'),('刘颖', '女', 23, '17728589999'),('周子恩', '女', 21, '11253467846');

        在 dos 命令窗口下,MySQL 遇到【;】将结束输入, 所以在创建存储过程时会报错。

        此时,需要使用【delimiter <符号>】更改结束符。为方便操作,以下操作均在 Navicat 里进行。


1.创建

create procedure p()
beginselect name, age, gender, phone from human;
end;


2.调用

call p();


3.查看

  1. 系统表 information_schema.routines 存储了存储过程、函数对象、触发器对象等状态信息;
  2. SPECIFIC_NAME:存储过程的具体名称,包括名称和参数列表;
  3. ROUTINE_SCHEMA:存储过程所在的数据库名称;
  4. ROUTINE_NAME:存储过程名称;
  5. ROUTINE_TYPE:PROCEDURE 表示存储过程,FUNCTION 表示一个函数;
  6. ROUTINE_DEFINITION:存储过程定义语言;
  7. CREATED:存储过程创建时间;
  8. LAST_ALTERED:存储过程最后修改时间;
  9. DATA_TYPE:存储过程返回值类型、参数类型等。
select SPECIFIC_NAME, ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_DEFINITION, CREATED, LAST_ALTERED, DATA_TYPE 
from information_schema.ROUTINES 
where ROUTINE_NAME = 'p';


4.删除

drop procedure if exists p;


三、变量

1.系统变量

(1)说明

  1. MySQL 系统变量是 MySQL 服务器运行时控制行为的参数,可以被设置为特定值从而改变服务器的默认设置;
  2. 系统变量有全局作用域和会话作用域。全局作用域对所有连接和所有数据库都适用,会话作用域只对当前连接和当前数据库适用。

(2)查看系统变量 

  1. 语法格式
    1. 【show [ global | session ] variables;】;
    2. 【show [ global | session ] variables like ' ';】;
    3. 【select @@[ global | session ].系统变量名;】。
  2. 未指定 global 和 session 时,默认是 session

(3)设置系统变量

  1. 语法格式:
    1. 【set [ global | session ] 系统变量名 = 值;】;
    2. 【set @@[ global | session ].系统变量名 = 值;】。
  2. 无论是全局设置还是会话设置,MySQL 服务器重启之后,之前的配置都会失效。可以通过修改 MySQL 安装根目录下的 my.ini 配置文件实现永久修改;
  3. my.ini 默认不存在,需要新建。在 Windows 系统下,文件后缀是【.ini】,在 Linux 系统下,文件后缀是【.cnf】。

2.用户变量

(1)说明

  1. 用户自定义的变量;
  2. 只对当前会话有效
  3. 所有用户变量以【@】开始

(2)用户变量赋值

  1. 语法格式
    1. 【set @用户变量名 = 值;】;
    2. 【set @用户变量名 := 值;】(推荐使用“:”形式);
    3. 【set @用户变量名 := 值, @用户变量名 := 值;】;
    4. 【select @用户变量名 := 值;】;
    5. 【select 字段名 into @用户变量名 from 表名 where 条件;】。
  2. MySQL 中用户变量无需声明,可直接赋值。若未声明直接读取,则返回 NULL。
set @id = 1;
set @`name` := '张鹏';
set @age := 23;
set @gender = '男', @phone = '13325678910';

(3)读取用户变量

        语法格式:【select @变量名1,  @变量名2, …;】。

select @id, @`name`, @age, @gender, @phone;


 3.局部变量

(1)说明

  1. 存储过程可以使用局部变量,使用【declare】声明,在 begin 和 end 之间有效;
  2. 局部变量只在存储过程中有效

(2)声明、赋值、读取与调用

  1. 语法格式:【declare 变量名 数据类型 [default …];】;
  2. declare 通常出现在 begin 和 end 之间。
drop procedure if exists p1;
create procedure p1()
begin-- 1.声明declare name varchar(10) default '佚名';declare age int default 0;-- 2.赋值set name := '徐佳禾';set age := 22;-- 3.读取select name, age;
end;-- 4.调用
call p1();


 四、IF

1.语法格式

        if [条件1] then [分支1]

        elseif [条件2] then [分支2]

        elseif [条件3] then [分支3]

        else [分支4]

        end if;


2.实例

        员工月薪高于 10000 属于“高收入”,6000 ~ 10000 属于中收入,低于 6000 属于低收入。查询员工薪资收入级别。

drop procedure if exists p2;create procedure p2()
begin -- 声明一个局部变量,存储月薪declare sal int default 0;-- 声明一个局部变量,存储薪资等级declare gra varchar(3);-- 赋值月薪set sal := 6000;if sal > 10000 then set gra := '高收入';elseif sal between 6000 and 10000 thenset gra := '中收入';elseset gra := '低收入';end if;select gra;
end;call p2();


五、参数

1.三种类型

  1. in:入参,接收调用者传入数据。未指定时默认为 in;
  2. out:出参,保存存储过程执行结果;
  3. inout:即是入参也是出餐。

2.in、out 实例 

        上方使用 if 语句判断薪资等级,每次修改月薪需要在存储过程中进行,如此不利于维护。可以使用参数改进。

drop procedure if exists p3;create procedure p3(in sal int, out gra varchar(3))
beginifsal > 10000thenset gra := '高收入';elseifsal < 6000thenset gra := '低收入';elseset gra := '中收入';end if;
end;call p3(10001, @grade);select @grade;


3.inout 实例

        将传入的薪资上调 10%。 

drop procedure if exists p4;create procedure p4(inout sal int)
begin set sal := sal * 1.1;
end;set @sal := 100;
call p4(@sal);
select @sal;


 六、CASE

1.语法格式1

        case 匹配条件

                when [值1] then [处理1]

                when [值2] then [处理2]

                else [处理3]

        end case;


2.语法格式2

        case

                when [条件1] then [处理1]

                when [条件1] then [处理1]

                else [处理3]

        end case;


3.实例

        3、4、5 月为春季,6、7、8 月为夏季,9,10,11 月为秋季,12,1,2 月为冬季。根据月份输出季节,其他输入为非法输入。 

-- 语法1
drop procedure if exists p5;
create procedure p5(in month int, out result char(2))
begincase monthwhen 3 then set result := '春季';when 4 then set result := '春季';when 5 then set result := '春季';when 6 then set result := '夏季';when 7 then set result := '夏季';when 8 then set result := '夏季';when 9 then set result := '秋季';when 10 then set result := '秋季';when 11 then set result := '秋季';when 12 then set result := '冬季';when 1 then set result := '冬季';when 2 then set result := '冬季';else set result := '非法';end case;
end;call p5(1, @season);
select @season;-- 语法2
drop procedure if exists p6;
create procedure p6(in month int, out result char(2))
begincasewhen month between 3 and 5 then set result := '春季';when month between 6 and 8 then set result := '夏季';when month between 9 and 11 then set result := '秋季';when month = 12 or month between 1 and 2 then set result := '冬季';else set result := '非法';end case;
end;call p6(6, @season);
select @season;


七、循环

1.WHILE 循环

(1)语法格式

        while [条件] do

                -- 循环体

        end while;


(2)实例

        传入整数 n,计算 1 ~ n 中所有偶数和。 

drop procedure if exists p7;create procedure p7(in n int)
begindeclare sum int default 0;while n > 0doif n % 2 = 0then set sum := sum + n;end if;set n := n - 1;end while;select sum;
end;call p7(10);


2.REPEAT 循环

(1)语法格式

         repeat

                -- 循环体

                until 条件

        end repeat;


(2)实例 

        传入整数 n,计算 1 ~ n 中所有偶数和。 

drop procedure if exists p8;create procedure p8(in n int)
begindeclare sum int default 0;repeatif n % 2 = 0then set sum := sum + n;end if;set n := n - 1;until n <= 0end repeat;select sum;
end;call p8(10);


3. LOOP 循环

(1)语法格式

        循环名:loop

                -- 循环体

                [ leave \ iterate ] 循环名;

        end loop;

# leave:类似于 Java 中的 break,结束当前循环;

# iterate:类似于 Java 中的 continue,结束本次循环。


(2)leave 实例 

        输出 1 ~ 6。

drop procedure if exists p9;create procedure p9()
begindeclare i int default 0;num:loopset i := i + 1;if i = 7then leave num;end if;select i;end loop;
end;call p9();


(3)iterate 实例

        输出 1、2、3、4、6、7、8、9。

drop procedure if exists p10;create procedure p10()
begindeclare i int default 0;num:loopset i := i + 1;if i = 11then leave num;elseif i = 5then iterate num;elseif i = 10then iterate num;end if;select i;end loop;
end;call p10();


八、游标 cursor

1.说明

  1. 游标是指向结果集中某条记录的指针,允许程序逐个访问结果集中的每条记录,并进行逐行操作;
  2. 使用游标需要在存储过程或函数中定义一个游标变量,并通过【declare】进行声明和初始化;
  3. 使用【open】开启游标;
  4. 使用【fetch】逐行获取游标指向的记录并处理;
  5. 最后使用【close】关闭游标,释放资源;
  6. 声明游标的语句必须在声明普通变量的下方。

2.步骤

(1)声明

        declare 游标名称 cursor for 查询语句;


(2)开启

         open 游标名称;


(3)获取

        fetch 游标名称 into 变量1, 变量2, …; 


(4)关闭

        close 游标名称; 


3.实例 

        从 二 中的 human 表中查询 name 和 gender,并插入一张新表 human_summary。

drop procedure if exists p11;create procedure p11()
begin-- 声明变量declare human_name varchar(10);declare human_gender char(2);-- 声明游标declare human_cursor cursor for select `name`, gender from human;-- 新建 human_summary 表drop table if exists human_summary;create table human_summary(id int primary key auto_increment,`name` varchar(10),gender char(2) default '未知');-- 开启游标open human_cursor;-- 循环获取数据while true dofetch human_cursor into human_name, human_gender;-- 插入数据insert into human_summary(`name`, gender) values(human_name, human_gender);end while;-- 关闭游标close human_cursor;
end;call p11();


 九、捕捉并处理异常

1.说明

  1. 语法格式:【declare [ 异常处理程序名 ] handler for [ SQL状态码 ] [ 执行语句 ];】;
  2. 异常处理程序
    1. continue:发生异常后,程序不终止,正常执行后续过程。即捕捉;
    2. exit:发生异常后,终止存储过程的执行。即上抛。
  3. SQL 状态码
    1. 可以填具体的数字状态码;
    2. SQLWARNING:代表所有 01 开始的 SQL 状态码;
    3. NOT FOUND:代表所有 02 开始的 SQL 状态码;
    4. SQLEXCEPTION:代表所有除 01、02 开始的 SQL 状态码。
  4. 执行语句:异常发生时执行的语句。

2.实例 

        上述游标中的实例,执行时会报错,因为循环是死循环。

        那么,如何改进呢?

drop procedure if exists p11;create procedure p11()
begindeclare human_name varchar(10);declare human_gender char(2);declare human_cursor cursor for select `name`, gender from human;-- 异常处理,在发生未发现异常时终止并关闭游标declare exit handler for not found close human_cursor;drop table if exists human_summary;create table human_summary(id int primary key auto_increment,`name` varchar(10),gender char(2) default '未知');open human_cursor;while true dofetch human_cursor into human_name, human_gender;insert into human_summary(`name`, gender) values(human_name, human_gender);end while;close human_cursor;
end;call p11();

十、存储函数

1.说明

  1. 存储函数是带有返回值的存储过程;
  2. 参数只能是 in,但不能显示地写 in。没有 out 和 inout。

2.语法格式

        create function 存储函数名称(参数列表) returns 数据类型 [ 特征 ]

        begin

                -- 函数体

        return …;

        end;

# 特征重要取值:

  1. deterministic:标记该函数为确定性函数,即每次调用函数时,传入相同的参数,返回值是固定的。这是一种优化策略,此情况下全部函数体的执行会省略,直接返回之前缓存的结果,提高函数的执行效率;
  2. no sql:标记该函数执行过程不会查询数据库,以向 MySQL 优化器表示不需要使用查询缓存和优化器缓存优化。避免不必要的查询消耗;
  3. reads sql data:标记该函数会进行查询操作,以向 MySQL 优化器表示该函数需要查询数据库,可以使用查询缓存优化。同时 MySQL 还会进行优化器缓存处理。

3.实例

        传入整数 n,计算 1 ~ n 中所有偶数和。

drop function if exists f;create function f(n int) returns int deterministic
begindeclare sum int default 0;while n > 0 doif n % 2 = 0 then set sum := sum + n;end if;set n := n - 1;end while;return sum;
end;set @result := f(10);
select @result;


十一、触发器

1.说明

  1. MySQL 触发器是一种数据库对象, 是与表相关联的特殊程序;

  2. 可以在 插入、更新、删除 触发时自动执行;

  3. 作用

    1. 强制实施业务规则:可以确保表中业务规则强制执行;

    2. 数据审计:可以声明在执行数据修改时自动记录日志或审计数据变化的操作;

    3. 执行特定业务操作:可以自动执行特定业务操作。

  4. 分类

    1. before:在执行 insert、update、delete 语句之前执行;

    2. after:在执行 insert、update、delete 语句之后执行。

  5. 触发器是一种数据库高级功能,只在必要条件下使用。过量的触发器和复杂的触发器逻辑可能会影响查询性能和扩展性。


2.语法规则 

        create trigger 触发器名称 [ before \ after ] [ insert \ update \ delete ] on 表名 for each row

        begin

                -- 触发器执行的 SQL 语句

        end;


3.关键字 new、old

  1. new 和 old 是两个特殊的关键字,用于引用在触发器中修改前后的旧值、新值。
    1. new:触发 insert 或 update 操作期间,new 用于引用将要插入或更新到表中新行的值;
    2. old:出发 update 和 delete 操作期间,old 用于引用更新或删除之前在表中旧行的值。
  2. 可以像引用其他列一样引用 new 和 old。

4.实例

# 1.首先,初始化一个日志表 log
drop table if exists log;
create table log(id bigint primary key auto_increment,table_name varchar(255) not null,operate varchar(10) not null,time datetime not null,operate_id bigint not null,description text 
);
# 2.向 human 表插入的触发器
drop trigger if exists trigger_human_insert;
create trigger trigger_human_insert after insert on human for each row
begininsert into log(table_name, operate, time, operate_id, description) values('human', '新增', now(), new.id, concat('插入:id = ', new.id, ',name = ', new.name, ',gender = ', new.gender, ',age = ', new.age, ',phone = ', new.phone));
end;-- 查询 log 日志表
select * from log;-- 向 human 表插入一条新数据
insert into human values(null, '柳梓熙', '女', '24', '18333256677');-- 查询 log 日志表
select * from log;
# 3.向 human 表更新的触发器
drop trigger if exists trigger_human_update;
create trigger trigger_human_update after update on human for each row
begininsert into log values(null, 'human', '更新', now(), new.id, concat('更新:[原数据:name = ', old.name, ',gender = ', old.gender, ',age = ', old.age, ',phone = ', old.phone, '];[新数据:name = ', new.name, ',gender = ', new.gender, ',age = ', new.age, ',phone = ', new.phone, ']'));
end;-- 查询 log 日志表
select * from log;-- 向 human 表修改一条新数据
update human set name = '刘梓琪' where id = 4;-- 查询 log 日志表
select * from log;
# 4.向 human 表删除的触发器
drop trigger if exists trigger_human_delete;
create trigger trigger_human_delete after delete on human for each row
begininsert into log values(null, 'human', '删除', now(), old.id, concat('删除:name = ', old.name, ',gender = ', old.gender, ',age = ', old.age, ',phone = ', old.phone));
end;-- 查询 log 日志表
select * from log;-- 向 human 表删除一条新数据
delete from human where name = '刘梓琪';-- 查询 log 日志表
select * from log;

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

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

相关文章

动态规划dp

这里写目录标题 动态规划01背包完全背包多重背包混合背包二维费用的背包分组背包有依赖的背包背包问题求方案数背包问题求具体方案数位 DP状压 DP常用例题 动态规划 01背包 有 n n n 件物品和一个容量为 W W W 的背包&#xff0c;第 i i i 件物品的体积为 w [ i ] w[i] w…

arcgis js统计FeatureLayer的椭球面积、平面面积

1、导入依赖 import FeatureLayer from arcgis/core/layers/FeatureLayer import { geodesicArea, planarArea, simplify } from arcgis/core/geometry/geometryEngine; import { project, load as projectionLoad } from arcgis/core/geometry/projection2、初始化project o…

2.2.1 05年T2

引言 本文将从一预习、二自习、三学习、四复习等四个阶段来分析2005年考研英语阅读第二篇文章。为了便于后续阅读&#xff0c;我将第四部分复习放在了首位。 四、复习 方法&#xff1a;错误思路分析总结考点文章梳理 4.1 错题分析 题目&#xff1a;26&#xff08;细节题&…

Java 连接并操作 Redis 万字详解:从 Jedis 直连到 RedisTemplate 封装,5 种方式全解析

引言 在分布式系统和高并发场景中&#xff0c;Redis 作为高性能内存数据库的地位举足轻重。对于 Java 开发者而言&#xff0c;掌握 Redis 的连接与操作是进阶必备技能。然而&#xff0c;从基础的 Jedis 原生客户端到 Spring 封装的 RedisTemplate&#xff0c;不同连接方式的原…

谈谈对《加密算法》的理解

文章目录 一、什么是加密算法&#xff1f;二、常见的加密算法有哪些&#xff1f;2.1 对称加密2.2 非对称加密2.3 哈希算法 三、加密算法代码展示3.1 MD5加密3.2 秘钥加密3.3 AES加密解密 四、加密算法的使用场景 一、什么是加密算法&#xff1f; 加密算法是一种通过数学方法将…

Fuzz 模糊测试篇JS 算法口令隐藏参数盲 Payload未知文件目录

1 、 Fuzz 是一种基于黑盒的自动化软件模糊测试技术 , 简单的说一种懒惰且暴力的技术融合了常见 的以及精心构建的数据文本进行网站、软件安全性测试。 2 、 Fuzz 的核心思想 : 口令 Fuzz( 弱口令 ) 目录 Fuzz( 漏洞点 ) 参数 Fuzz( 利用参数 ) PayloadFuzz(Bypass)…

哈希表的实现(下)

目录 前言 开散列概念 开散列实现 Insert 优化 Find Erase 前言 上一章节我们用闭散列实现了一下哈希表&#xff0c;但存在一些问题&#xff0c;比如空间浪费比较严重&#xff0c;如果连续一段空间都已经存放值&#xff0c;那么在此位置插入新值的时候就会一直挪动&…

再谈Linux 进程:进程等待、进程替换与环境变量

目录 1.进程等待 为什么需要进程等待&#xff1f; 相关系统调用&#xff1a;wait()和waitpid() wait(): waitpid(): 解析子进程状态&#xff08;status&#xff09; 2.进程替换 为什么需要进程替换&#xff1f; 相关系统调用&#xff1a;exec函数家族 3.环境变量 ​…

基于深度学习的无线电调制识别系统

基于深度学习的无线电调制识别系统 本项目实现了一个基于深度学习的无线电调制识别系统&#xff0c;使用LSTM&#xff08;长短期记忆网络&#xff09;模型对不同类型的 无线电信号进行自动分类识别。该系统能够在不同信噪比(SNR)条件下&#xff0c;准确识别多种调制类型&#…

Python 爬虫之requests 模块的应用

requests 是用 python 语言编写的一个开源的HTTP库&#xff0c;可以通过 requests 库编写 python 代码发送网络请求&#xff0c;其简单易用&#xff0c;是编写爬虫程序时必知必会的一个模块。 requests 模块的作用 发送网络请求&#xff0c;获取响应数据。 中文文档&#xf…

随机森林(Random Forest)学习

随机森林是一种基于集成学习的机器学习算法&#xff0c;属于Bagging&#xff08;Bootstrap Aggregating&#xff09;方法的一种扩展。它通过组合多个决策树来提升模型的泛化能力和鲁棒性&#xff0c;广泛用于分类、回归和特征选择任务。 1.随机森林核心思想 1.1少数服从多数 在…

从 0 到 1!Java 并发编程基础全解析,零基础入门必看!

写在前面 博主在之前写了很多关于并发编程深入理解的系列文章&#xff0c;有博友反馈说对博主的文章表示非常有收获但是对作者文章的某些基础描述有些模糊&#xff0c;所以博主再根据最能接触到的基础&#xff0c;为这类博友进行扫盲&#xff01;当然&#xff0c;后续仍然会接…

el-input宽度自适应方法总结

使用 style 或 class 直接设置宽度 可以通过内联样式或 CSS 类来直接设置 el-input 的宽度为 100%&#xff0c;使其自适应父容器的宽度 <template><div style"width: 100%;"><el-input style"width: 100%;" v-model"input">…

解决 Supabase “permission denied for table XXX“ 错误

解决 Supabase “permission denied for table” 错误 问题描述 在使用 Supabase 开发应用时&#xff0c;你可能会遇到以下错误&#xff1a; [Nest] ERROR [ExceptionsHandler] Object(4) {code: 42501,details: null,hint: null,message: permission denied for table user…

java每日精进 5.20【MyBatis 联表分页查询】

1. MyBatis XML 实现分页查询 1.1 实现方式 MyBatis XML 是一种传统的 MyBatis 使用方式&#xff0c;通过在 XML 文件中编写 SQL 语句&#xff0c;并结合 Mapper 接口和 Service 层实现分页查询。分页需要手动编写两条 SQL 语句&#xff1a;一条查询分页数据列表&#xff0c;…

linux taskset 查询或设置进程绑定CPU

1、安装 taskset larkubuntu&#xff1a;~$ sudo apt-get install util-linux larkubuntu&#xff1a;~$ taskset --help 用法&#xff1a; taskset [选项] [mask | cpu-list] [pid|cmd [args...]] 显示或更改进程的 CPU 关联性。 选项&#xff1a; -a&#xff0c; --all-tasks…

Python应用字符串格式化初解

大家好!在 Python 编程中&#xff0c;字符串格式化是一项基础且实用的技能。它能让你更灵活地拼接字符串与变量&#xff0c;使输出信息更符合需求。本文将为和我一样的初学者详细介绍 Python 字符串格式化的常用方法。 定义: 字符串格式化就是将变量或数据插入到字符串中的特定…

EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案

一、方案概述​ 数字技术发展促使在线教育、远程医疗等行业对一对一实时音视频通信需求激增。传统方式存在低延迟、高画质及多场景适配不足等问题&#xff0c;而EasyRTC凭借音视频处理、高效信令交互与智能网络适配技术&#xff0c;打造稳定低延迟通信&#xff0c;满足基础通信…

SEO长尾词优化精准布局

内容概要 长尾关键词作为SEO策略的核心要素&#xff0c;其价值在于精准捕捉细分需求与低竞争流量入口。相较于短尾词的高泛化性&#xff0c;长尾词通过语义扩展与场景化组合&#xff0c;能够更高效地匹配用户搜索意图&#xff0c;降低优化成本的同时提升转化潜力。本文将从词库…

【MySQL】第7节|Mysql锁机制与优化实践以及MVCC底层原理剖析

锁等待分析 我们通过检查InnoDB_row_lock相关的状态变量来分析系统上的行锁的争夺情况 示例场景 假设有两个用户同时操作账户表 accounts&#xff08;主键为 id&#xff09;&#xff1a; 1. 用户A&#xff1a;执行转账&#xff0c;锁定账户 id1 并等待3秒&#xff1a; BEG…