SQL学习笔记1

article/2025/9/17 4:27:21

 * 以下内容是我在学习SQL(http://www.w3school.com.cn/sql/index.asp)的时候的学习笔记

 * 学习时使用的数据库软件是MySQL数据库可视化工具SQLyogEnt

 * 如果大家有发现什么不对的地方请告诉我。谢啦!!☆⌒(*^-゜)v

 * 在这里需要注意的是,和SqlServer相比MySQL不支持事务处理,没有视图,没有存储过程和触发器,没有数据库端的用户自定义函数,不能完全使用标准的SQL语法

 

第一章 SQL基础教程

一、SQL简介

1:什么是SQL?

A:SQL指结构化查询语句    B:SQL使我们有能力访问数据库     C:SQL是一种ANSI(美国国家标准化组织)的标准计算机语言

2:SQL能做什么?

*面向数据库执行查询   *从数据库中取出数据   *向数据库插入新的记录   

*更新数据库中数据   *从数据库删除记录   *创建数据库   *创建表   

*创建存储过程   *创建视图   *设置表、存储过程和视图的权限

3:RDBMS

RDBMS是指关系型数据库管理系统

RDBMS是SQL的基础,同样也是所有现代数据库系统的基础,如MS SQL Server、IBM DB2、Oracle、MySQL以及Microsoft Access

RDBMS中的数据存储在被称为表的数据库对象中

表是相关的数据项的集合,他由列和行组成。

二、SQL语法

注意:SQL对大小写不明感!!!

1:SQL语句后面的分号

某些数据库系统要求在每条SQL命令的末端使用分号。

分号是在数据库系统中分隔每条SQL语句的标准方法,这样就可以在服务器的相同请求中执行一条以上的语句。

如果使用的是MS Access和SQL Server 2000,则不必在每条SQL语句之后使用分号,不过某些数据库要求必须使用分号。

2:SQL DML和DDL

可以把SQL分为两个部分:数据操作语言(DML)和数据库定义语言(DDL)

SQL(结构化查询语句)是适用于执行查询的语法。但是SQL语言也包含用于更新、插入和删除记录的语法。SQL的DML部分:select、update、delete、insert into 。 数据库定义语言(DDL)部分使我们有能力创建或删除表格,我们也可以定义索引(键),规定表之间的连接,以及表间的约束:

Create database、alert database、create table、alert table、drop table、create index、drop index

三、Select

User表里面的数据如下

 

查询user表里面的user_name字段和user_age字段的所有数据

Select user_name,user_age from user

 

查询user表中所有的字段数据,用 * 表示列的名称

Select * from user

 

四、Distinct

Distinct选取所有的值的时候不会出现重复的数据

用普通的查询,查询所有

Select * from user

 

Select distinct user_name,user_age from user

注意:不能有user_id,因为两个Mary的user_id不一样,加上就不算相同数据

 

五、Where

1:查询user_id等于1 的数据

Select * from user where user_id = 1

 

2:查询user_age大于等于12的数据

Select * from user where user_age >=12

 

3:查询user_age不等于12的数据

Select * from user where user_age <> 12

 

六、ADN 和 OR

And和or在where子语句中把两个或多个条件结合起来。如果需要两个条件都成立就是用and如果只需要其中一个条件成立就使用or

Select * from user where user_name = 'mary' and user_age = 12

需要注意的是SQL使用单引号来环绕文本值,如果是数值则不需要引号

 

Select * from user where user_name='mary' or user_age =13

 

结合and和or使用圆括号来组成复杂的表达式

Select * from user where (user_name = 'mary' and user_age = 12) or(user_age =13)

 

七、Order by

1:对指定列进行升序排列

Select * from user order by user_name

 

2:按照user_id逆序排列

Select * from user order by user_id DESC

 

2:按照升序排列user_id逆序排列user_age

SELECT * FROM user order by user_id ASC,user_age DESC

 

3:按照升序排列user_id逆序排列user_age

SELECT * FROM user order by user_age DESC,user_id ASC

 

注意:前面的条件优先级更高!!

八、Insert

User表

 

插入一行数据 user_id为2 user_name为tom,user_age为12

注意:如果每一项都有插入的话就不需要在前面列出列名!!

Insert into user values(2,'tom',12)

新插入一行数据,只要求user_name为eva

Insert into user(user_name) values('eva')

注意:因为ID设置为自增,所以user_id不为null

 

九、Update

修改user_id为6的数据user_age为14

Update user set user_age=14 where user_id=6

 

修改user_id为1的数据user_name为ann,user_age为11

Update user set user_name='ann',user_age=11 where user_id=1

十、Delete

User表中的所有数据信息如下

 

删除user_age为12的数据

Delete from user where user_age=12

 

删除表中的所有数据

Delete from user

 

第二章 SQL高级教程

一、Top

Top子句用于返回要返回的记录的数目,但并不是所有的数据库都支持top子句

1:SQL Server

Select top 5 * from user

2:MySQL

Select * from user limit 5

3:Oracle

Select * from user where ROWNUM <= 5

二、Like

User表的初始数据如下

1:找出以li开头的数据

Select * from user where user_name like 'li%'

2:找出以ry结尾的数据

Select * from user where user_name like '%ry'

 

3:找出含有a的数据

Select * from user where user_name like '%a%'

 

4:找出第二个字母是a第四个字母是y的数据

Select * from user where user_name like '_a_y'

 

三、通配符

在搜索数据库中的数据的时候SQL通配符可以替代一个或多个字符。SQL通配符必须与like运算符一起使用

1: _ 替代一个字符

找出第二个字母是a第四个字母是y的数据

Select * from user where user_name like '_a_y'

 

2: % 替代一个或多个字符

找出以ry结尾的数据

Select * from user where user_name like '%ry'

 

3: [] 字符列中的任意一个单字符(在SQL Server里面有作用,在MySQL里面不会报错但找不到值)

找出以a或者l开头的数据

Select * from user where user_name like '[al]%'

找出不是a或者l开头的数据

Select * from user where user_name like '[^al]%'

四、In

只要数据满足in里面的一个条件就可以了

找到user_age是12或者13的数据

Select * from user where user_age in (12,13)

 

找到user_name是Harry和Mary的数据

Select * from user where user_name IN ('mary','harry')

 

五、Between

选取两个值之间的数据

查询年龄在12和14之间的数据

Select * from user where user_age between 12 and 14

 

查询字母在Alice和John之间的数据

Select * from user where user_name between 'alice' AND'john'

 

六、Aliases

指定别名

假设我们有两个表分别是user和Room 。我们分别指定他们为u和r。

1:不使用别名

Select room.room_name,user.user_name,user.user_age from user ,room  Where user.user_age=12 and room.room_id = 1

 

2:使用别名

使用别名的时候直接将别名跟在后面,不使用as也可以

Select r.room_name,u.user_name,u.user_age from user as u,room as r  Where u.user_age=12 and r.room_id = 1

 

七、Join

数据库中的表可以通过键将彼此联系起来,主键是一个列,在这个列中的每一行的值都是唯一的,在表中,每个主键的值都是唯一的,这样就可以在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

以下为表user和表Room的数据

     

1:引用两个表

找出在Room of boy相关联的用户信息

Select u.user_name,u.user_age,r.room_name from user as u,room as r 

Where u.room_id = r.room_id and r.room_name='room of boy'

 

2:使用关键字join来连接两张表

Select u.user_name,u.user_age,r.room_name

from user as u

join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

 

八、Inner join

Inner join 与 join 用法一致

Select u.user_name,u.user_age,r.room_name

from user as u

inner join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

 

九、Left join

注意:左连接以左边的表为主体,也就是说会列出左边的表中的所有的数据,无论它是否满足条件。

1:user在左边

Select u.user_name,u.user_age,r.room_name

from user as u

Left join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

 

2:Room在左边

Select u.user_name,u.user_age,r.room_name

From room as r

Left join user as u

on u.room_id = r.room_id and r.room_name='room of boy'

 

十、Right join

注意:左连接以右边的表为主体,也就是说会列出左边的表中的所有的数据,无论它是否满足条件。

1:Room在右边

Select u.user_name,u.user_age,r.room_name

from user as u

Right join room as r

on u.room_id = r.room_id and r.room_name='room of boy'

 

2:user在右边

Select u.user_name,u.user_age,r.room_name

from  room as r

Right join user as u

on u.room_id = r.room_id and r.room_name='room of boy'

 

十一、Full join

1:user在左边

Select * from user Full join room

 

2:Room在左边

Select * From room full join user

 

注意:SQL错误码1054表示没有找到对应的字段名;错误码1064表示用户输入的SQL语句有语法错误

十二、Union

Union操作符用于合并两个或者多个SELECT语句的结果集

请注意,UNION内部的select语句必须拥有相同数量的列。列也必须拥有相同的数据类型。同时,每条select语句中的列的顺序必须相同。

下面是Room表和color表的数据

     

Select room_name from room

Union

Select color_name from color

 

默认的union选取不同的值,如果想要有相同的值出现就使用union all

Select room_name from room

Union all

Select color_name from color

 

十三、Create DB

创建数据库mysqltest

Create database mysqltest

 

十四、Create table

Create table sqltest(

Id int,

Name varchar(45),

Age int,

Salary float,

Time Date,

)

  

十五、Constraints

SQL约束,用于限制加入表的数据的类型

常见约束:not null、unique、primary key、foreign key、check、default

十六、Not null

Not null 约束,强制列不接受NULL值。Not null 约束强制字段始终包含值,这意味着,如果不向字段添加值,就无法插入新的字段或者更新记录

用法,在字段后面加上 not null

 

十七、Unique

Unique约束,唯一标识数据库中的每一条记录。Primary key约束拥有自动的unique约束。需要注意的是,每个表里面可以拥有多个unique约束,但只能有一个primary key约束

1:MySQL用法,unique(字段名)

 

2:SQL Server 、 Oracle 、 MS Access在字段后面加

 

3:命名约束使用constraint

 

4:已经创建了表之后需要添加约束

ALTER TABLE sqltest ADD UNIQUE(Age)

 

5:给已经创建了的表添加约束并命名

ALTER TABLE sqltest ADD constraint unique_name UNIQUE(Age,salary)

 

6:撤销约束

MySQL

在没有给约束命名的情况下(上面的age约束)直接使用字段名就可以了

ALTER TABLE sqltest DROP INDEX age

  删除后   

在约束有名字的情况下,直接使用名字就可以了

ALTER table sqltest  drop index unique_name

   删除后  

SQL Server 、 Oracle 、 MS Access

ALTER table 表名 drop constraint 约束名

十八、Primary key

Primary key约束唯一标识数据库表中的每一条记录,组件必须包含唯一的值。组件列不能包含NULL值。每个表都应该有一个主键,并且每一个表都只能有一个主键

1:在MySQL中的用法

 

2:在SQL Server 、 Oracle 和MS Access中的用法

 

3:为已经创建成功的表创建primary key约束

Alter table sqltest add primary key(id)

 

4:为已经创建成功的表添加主键约束,以及为多个列定义主键约束

Alter table sqltest add constraint pk_name primary key (id,name)

 

5:在MySQL中撤销主键

ALTER  TABLE sqltest DROP PRIMARY KEY

   删除后   

6:在SQL Server、Oracle、MS Access中撤销主键

Alter table 表名 drop constraint 主键名

十九、Foreign key

所谓的外键,即一个表的外键指向另一个表的主键

User表

Room表

在user表里面room_id列指向Room表里面的id列。Room表里面的id列是主键,user表里面的room_id列是外键。外键约束用于预防破坏表之间的连接动作,外键约束也能防止非法数据插入外键列,因为他必须是他指向的那个表的值之一。

 

二十、Check

Check约束用于限制列中的值的范围。如果对单一的列定义check约束,那么改了只允许特定的值。如果对一个表定义check约束,那么此约束会在特定的列中对值进行限制。

 

为已经创建成功的表添加check约束

ALTER TABLE USER ADD CHECK (age>10)

二十一、Default

Default约束用于向列中插入默认值。如果没有规定其他值,那么就会将默认值添加到所有的新纪录。

用法:

 

当表已经存在的时候,添加默认值

ALTER TABLE sqltest ALTER NAME SET DEFAULT 'tom'

 

撤销默认值

 

二十二、Create index

索引,你可以在表里面创建索引,一边更加快速高效地查询数据。用户无法看见索引,他们只能被用来加速搜索、查询。

注意:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是索引本身也需要更新,因此,理想的做法是仅仅在常常被搜索的列上面创建索引。

1:创建一个索引

CREATE INDEX index_name ON color (color_id )

 

2:创建一个独一无二的索引,即两行不能拥有相同的索引值。

CREATE UNIQUE INDEX book_index ON book (book_id)

 

3:如果索引不止一个列,你可以在括号中列出这些列的名称,用逗号隔开

CREATE INDEX index_bank ON bank (bank_id,bank_name)

 

二十三、Drop

通过使用DROP语句,可以删掉索引、表和数据库

1:删除索引

Drop index index_name on color

 

删除之后

 

2:删除表

DROP TABLE colorcopy

  删除之后   

3:清空表

TRUNCATE TABLE color

  删除之后  

4:删除数据库

DROP DATABASE mysqltest

 删除之后  

二十四、Alert

 

1:添加列

Alter table user add salary float

 

2:删除列

Alter table user drop column room_id

 

二十五、Increment

定义主键自增

 

二十六、View

视图,一种基于SQL语句的结果集可视化表。视图包含行和列,就像一个真实的表。视图中的字段来自一个或多个数据库中的真实的表中的字段,我们可以向视图添加SQL函数、where以及join语句,我们提交数据,然后这些来自某个单一的表。需要注意的是,数据库中的结构和设计不会受到视图的函数、where或join语句的影响

1:创建一个视图,字段来自user表和Room表

CREATE VIEW view_test AS

SELECT user.user_name,user.user_age,room.room_name

FROM USER,room

WHERE user.user_age>10

2:查询视图

Select * from view_test

 

3:撤销视图

DROP VIEW view_test

二十七、Date

 

二十八、Nulls

默认的,表的列可以存放NULL值。如果表里面的某个列是可选的,那么我们可以在不想该列添加值的情况下插入记录或者更新记录,这意味着该字段以NULL值保存。注意,NULL和0是不等价的,不能进行比较。

 

1:查询NULL值 

select * from user where salary is null

 

2:查询非NULL值 

select * from user where salary  is not null

 

二十九、数据类型

MySQL主要有三种类型:文本、数字、日期

 

 

三十、服务器 

 

第三章 SQL函数

一、SQL functions

在SQL当中,基本的函数类型和种类有若干种,函数的基本类型是:

合计函数(Aggregate function)和 Scalar函数

Aggregate 函数,函数操作面向一系列的值,并返回一个单一的值。

Scalar 函数,操作面向某个单一的值,并返回基于输入值的一个单一的值。

二、Avg()

求平均年龄

Select avg(user_age) from user

 

求大于平均年龄的用户

Select * from user where user_age>(Select avg(user_age) from user)

 

三、Count()

返回列的值的数目(不包含NULL)

注意,可以使用as来给count()取一个别名

 

Select count(user_id) from user

 

Select count(salary) from user

 

返回值不同的有多少

Select count(distinct user_name) from user

 

查询所有列

Select count(*) from user

 

四、Max()

返回最大值,NULL不包括在计算中

 

Select max(price) as max_price from commodity

 

五、Min()

返回最小值,NULL不包括在计算中

 

Select min(salary) poor_man from user

 

六、Sum()

返回该列值的总额

 

Select sum(salary) from user

 

七、Group By 

用于结合合计函数,根据一个或多个列对结果集进行分组

 

SELECT cname,SUM(price) FROM commodity GROUP BY cname

 

八、Having

在SQL中增加having子句的原因是where不能与合计函数一起使用。用法和where 一样

SELECT cname,SUM(price) FROM commodity

GROUP BY cname

HAVING  SUM(price)>20

 

九、Ucase()

把函数字段的值转化为大写

 

SELECT UCASE(user_name) FROM user

 

十、Lcase()

将函数字段转化为小写

 

Select lcase(user_name) from user

 

十一、Mid()

从文本字段中提取字符

 

Select mid(user_name,2,2) from user

 

十二、Round()

Round函数把数值字段舍入为指定的小数位数

 

Select round(salary,2) from user

 

十三、Now()

返回当前时间

SELECT NOW() FROM user

 

 

学习完了之后我们可以进入位w3chool的‘SQL测试’进行测试 

http://www.w3school.com.cn/sql/sql_quiz.asp

 ( ^_^ )/~~拜拜

 

转载于:https://www.cnblogs.com/minuobaci/p/7224956.html


http://chatgpt.dhexx.cn/article/im8Qd8qn.shtml

相关文章

史上最全SQL学习指南(教程+实例+练习题)

报告称&#xff0c;未来10年数据细分岗位将扩张5倍&#xff0c;大数据19w的人才缺口将继续增加。国内外一线互联网公司纷纷开设了数据分析岗位。 数据分析岗位中用的最频繁的工具就是SQL了。不论是满足业务日常取数需求&#xff0c;还是自己做分析&#xff0c;都离不开SQL。 …

SQL入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

导读&#xff1a; SQL语言有40多年的历史&#xff0c;从它被应用至今几乎无处不在。我们消费的每一笔支付记录&#xff0c;收集的每一条用户信息&#xff0c;发出去的每一条消息&#xff0c;都会使用数据库或与其相关的产品来存储&#xff0c;而操纵数据库的语言正是 SQL &…

SQL零基础入门必知必会!

&#x1f4da; 前言 SQL语言有40多年的历史&#xff0c;从它被应用至今几乎无处不在。我们消费的每一笔支付记录&#xff0c;收集的每一条用户信息&#xff0c;发出去的每一条消息&#xff0c;都会使用数据库或与其相关的产品来存储&#xff0c;而操纵数据库的语言正是 SQL &am…

redis:redis缓冲区溢出怎么办

引入 什么是缓冲区&#xff1a;用一块内存空间来暂时存放命令数据&#xff0c;以免出现因为数据和命令的处理速度慢与发送速度而导致的数据丢失和性能问题但是问题是&#xff0c;因为缓冲区的内存空间是有限的&#xff0c;如果往里面写入数据的速度大于从里面读取数据的速度&a…

【缓冲区溢出】堆溢出原理

一、操作系统中堆和栈的区别 堆内存申请&#xff0c;释放&#xff0c;操作&#xff0c;特点&#xff1a; 1. 堆内存申请环境:堆内存需要程序员在程序中申请 &#xff0c;动态分配&#xff0c;申请的大小有程序决定。 2. 堆内存申请方法&#xff1a;C语言中的malloc&#xff08;…

本地缓冲区溢出

本地缓冲区溢出 【实验目的】 1、掌握缓冲区溢出的基本原理&#xff1b; 2、熟练利用jmp.egp指令实现缓冲区溢出&#xff1b; 3、掌握缓冲区溢出的危害及其防范手段。 【实验环境】 登录Linux靶机环境&#xff0c;在无root权限的情况下&#xff0c;通过编译运行程序&#x…

关于缓冲区溢出(Buffer Overflow)

接触黑客的同志们经常遇到&#xff0c;使用一些扫描工具扫描的时候&#xff0c;会得到一些缓冲区溢出的漏洞&#xff0c;但是怎么利用自己是一团雾水 网上很少有相关的工具&#xff0c;也很少有相关的文章&#xff0c;下面我们就说说这个“窿西”吧 [蛋痛]文章丢失了一次&…

高并发缓存队列防止溢出解决方案

目录 1 背景介绍1.1 设计分析微信抢红包1.2 红包定时导入缓存队列 2 队列术限流2.1 高并发场景分析2.2 队列削峰实战 3 设计原则3.1 动静分离3.2 微服务化3.3 负载均衡3.4 异步消息3.5 缓存预热 4 Nginx通过LUA脚本访问RabbitMQ消息队列 1 背景介绍 并发量非常大的系统&#x…

【2021.12.12】缓冲区溢出利用

文章目录 1.1 实验环境和开发工具1.2 任务描述1.3 分析过程1.4 结论1.4.1 利用漏洞1.4.2 修复漏洞 1.1 实验环境和开发工具 处理器 i5-8300H 内存&#xff08;RAM&#xff09; 8G 硬盘 476G 软件环境&#xff1a; Windows 10 开发工具: Visual studio 2019 IDA PRO7.5 1.2 …

本地缓冲区溢出分析

栈溢出是缓冲区溢出中最为常见的一种攻击手法&#xff0c;其原理是&#xff0c;程序在运行时栈地址是由操作系统来负责维护的&#xff0c;在我们调用函数时&#xff0c;程序会将当前函数的下一条指令的地址压入栈中&#xff0c;而函数执行完毕后&#xff0c;则会通过ret指令从栈…

关于缓冲区溢出的对策

从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前&#xff0c;将return address的副本保存在一个安全的地方&#xff0c;函数返回时将返回地址与预先保存的返回地址比较&#xff0c;以判断缓冲区溢出是否发生。 …

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击&#xff0c;但是关于这一块的内容还是需要很多相关知识的基础&#xff0c;例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间&#xff0c;这里简单的做一个学习的总结&#xff0c;通过具体的实验案例对缓冲区溢出进行简要的解析…

缓冲区溢出原理详解

下面将有实例引入缓冲区溢出的介绍&#xff1a; void main() { int i0; int a[]{1,2,3,4,5,6,7,8,9,10}; for(i0;i<10;i) { a[i]0;printf("Hello World!\n");} } 首先&#xff0c;这段代码会出现死循环&#xff0c;为什么&#xff1f;因为数组溢出了&…

C语言 缓存区溢出 3221225725

目录 问题描述解决办法&#xff1a; 问题描述 DEV-C报错 Process exited after 4.03 seconds with return value 3221225725 原因 数组定义的容量太大 - 五十万起步的样子 而且每次循环都会再定义一次&#xff0c;导致缓存区溢出 解决办法&#xff1a; 思路来源&#xff1a…

什么是缓冲区溢出?有什么危害?原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量&#xff0c;溢出的数据覆盖在合法数据上。 危害有以下两点&#xff1a; 1、程序崩溃&#xff0c;导致拒绝服务 2、跳转并且执行一段恶意代码 原因&#xff1a;造成缓冲区溢出的主要原因是程序中没有仔细检查用…

什么是缓冲区溢出?有说明危害?

缓存溢出 缓存溢出(Buffer overflow) &#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满-一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以…

缓存区溢出的原理分析和防范

1.前言 缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞&#xff0c;在各种操作系统、应用软件中广泛存在。缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击&#xff0c;轻则可以导致程序失败、系统关机等&#xff0c;重则可以利用它执行非授权指令&#xff0…

缓存溢出

缓存溢出&#xff08;Buffer overflow&#xff09;&#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得…

逆向基础:软件手动脱壳技术入门

前言&#xff1a; 大家好&#xff0c;我是周杰伦 这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过…

iOS逆向之脱壳工具creakerXI+,最简单、最适合新手的脱壳工具

在学习iOS逆向中&#xff0c;脱壳是必备技能之一&#xff0c;在网上看教程有使用 Clutch 和 dumpdecrypted 但是&#xff0c;不知道 是我操作问题&#xff0c;还是手机版本&#xff0c;以及APP版本更新问题 尝试了几次&#xff0c;都无法成功脱壳 最后在网上看到有大神分享其…