MySQL数据库基础(五)——SQL查询

MySQL数据库基础(五)——SQL查询

一、单表查询

1、查询所有字段

在SELECT语句中使用星号“”通配符查询所有字段
在SELECT语句中指定所有字段
select
from TStudent;

2、查询指定字段

查询多个字段
select Sname,sex,email from TStudent;

3、查询指定记录

在SELECT 语句中通过WHERE子句,对数据进行过滤,语法格式为:
SELECT 字段名1,字段名2,…,字段名n FROM 表名WHERE 查询条件
select Sname,sex,email,Class from TStudent where class='java';

4、带IN关键字的查询

查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检索条件用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
查新姓 王 刘 石的学生
select * from TStudent where left(sname,1) in ('王','刘','石');

5、带BETWEEN AND的范围查询

查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,如果字段值满足指定的范围查询条件,则这些记录被返回。
以下查询条件,查询学号100到150的学生,包括100和150
select from TStudent where convert(studentid,signed) between 100 and 150
等价于
select
from TStudent where convert(studentid,signed)>=100
and convert(studentid,signed)<=150
自动转换类型
select * from TStudent where studentid between 100 and 150

6、带LIKE的字符匹配查询

百分号通配符‘%’,匹配任意长度的字符,甚至包括零字符
下划线通配符‘_’,一次只能匹配任意一个字符
查找姓名中间字为“志”字的学生
select from TStudent where sname like '' ;
查找姓名中有“志”字的学生
select
from TStudent where sname like '%志%';

7、查询空值

在SELECT语句中使用IS NULL子句,可以查询某字段内容为空记录。
查找邮箱是空值的记录
select * from s where email is null;

8、带AND的多条件查询

使用AND连接两个甚至多个查询条件,多个条件表达式之间用AND分开。
select * from TStudent where sex='男' and Class='net' and studentid&gt;20 and studentid&lt;50;

9、带OR的多条件查询

OR操作符,表示只需要满足其中一个条件的记录即可返回。OR也可以连接两个甚至多个查询条件,多个条件表达式之间用AND分开。
select * from TStudent where sname like '%志%' or class='net';

10、查询结果不重复

在SELECT语句中可以使用DISTINCE关键字指示MySQL消除重复的记录值。
SELECT DISTINCT 字段名 FROM 表名;
查询一共有几个班
select distinct class from TStudent;

11、用LIMIT限制查询结果的数量

LIMIT关键字可以返回指定位置的记录。
LIMIT [位置偏移量,] 行数
返回前10个学生
select from TStudent limit 10;
返回第11-20个学生,偏移量是10,就意味着从第11个开始取10条记录。
select
from TStudent limit 10,10;

12、合并查询结果

利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
要求第一个SQL语句返回的列和第二条返回的列数相同,
select studentid,sname from TStudent where studentid<=10
union
select studentid, sname from TStudent where sname like '王%';

13、为表和字段取别名

为字段取别名
MySQL可以指定列别名,替换字段或表达式。
列名 [AS] 列别名
select studentid as 学号,sname as 姓名,sex as 性别 from TStudent
select studentid 学号,sname 姓名,sex 性别 from TStudent
为表取别名
为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用别名替代表原来的名称。
表名 [AS] 表别名
select a.studentid 学号,a.sname 姓名,a.sex 性别 from TStudent as a;
select a.studentid 学号,a.sname 姓名,a.sex 性别 from TStudent a;

二、多表连接查询

1、内连接查询

内连接(INNER JOIN)使用比较运算符根据每个表共有的列的值匹配两个表中的行,并列出表中与连接条件相匹配的数据行,组合成新的记录。在内连接查询中,只有满足条件的记录才能出现在结果关系中。
语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。
select a.StudentID, a.Sname, b.mark from TStudent a, TScore b where a.StudentID=b.StudentID;
语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。
select a.StudentID, a.Sname, b.mark from TStudent a inner joinTScore b on a.StudentID=b.StudentID;
select a.StudentID,a.Sname,c.subJectName,b.mark from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID;
MySQL数据库基础(五)——SQL查询
如果某列只在一张表中,就可以不用指明是哪个表中的列。
select a.StudentID,a.Sname,subJectName,mark from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID;
MySQL数据库基础(五)——SQL查询

2、外连接查询

外连接分为左连接、右连接、全连接。
外连接返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
左连接
包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行。
左连接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 
select a.StudentID, a.Sname, b.mark from TStudent a left join TScore b on a.StudentID=b.StudentID;
MySQL数据库基础(五)——SQL查询
右连接:
右连接包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行。
右连接是左连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。    
select a.StudentID, a.Sname, b.mark from TScore b right join TStudent a on a.StudentID=b.StudentID;
MySQL数据库基础(五)——SQL查询
全连接:
全连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。MySQL不支持全外连接。可以通过左外和右外求合集来获取全外连接的查询结果。
select a.StudentID, a.Sname, b.mark from TStudent a left join
TScore b on a.StudentID=b.StudentID
union
select b.StudentID, c.subJectName, b.mark from TScore b right join
TSubject c on b.subJectID=c.subJectID;
MySQL数据库基础(五)——SQL查询

3、交叉连接

交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接有显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
FROM子句中的表或视图可通过内连接或全连接按任意顺序指定;但是,用左或右向外连接指定表或视图时,表或视图的顺序很重要。
隐式交叉连接,没有cross join
select a.StudentID, a.Sname, b.mark from TStudent a,TScore b where a.StudentID < 4;
显示交叉连接,有cross join
select a.StudentID, a.Sname, b.mark from TStudent a cross join TScore b where a.StudentID < 4;
MySQL数据库基础(五)——SQL查询

4、SQL查询的原理

第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表;然后根据SELECT的选择列选择相应的列进行返回最终结果。
第二、两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。实例如下:
select a.StudentID, a.Sname, b.mark from TStudent a left join TScore b on a.StudentID=b.StudentID where a.StudentID < 10;
第三、多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。

5、过滤条件

ON条件:过滤两个连接表笛卡尔积形成中间表的约束条件。
WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
将WHERE条件移入ON后面是不恰当的。推荐的做法是ON只进行连接操作,WHERE只过滤中间表的记录。

6、连接查询的适用场景

连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。两表连接查询选择方式的依据:
A、查两表关联列相等的数据用内连接。
B、Col_L是Col_R的子集时用右连接。
C、Col_R是Col_L的子集时用左连接。
E、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全连接。
F、求差操作的时候用联合查询。

三、对查询结果排序

MySQL中可以通过在SELECT使用ORDER BY子句对查询的结果进行排序。

1、单列排序

ASC代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出。默认升序ASC排序。
select from TStudent order by birthday asc;
select
from TStudent order by birthday desc;

2、多列排序

可以分别指定排序方向。
select a.StudentID,a.Sname,subJectName,mark from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID where c.subJectID='0001' order by mark desc,a.studentID desc;

四、分组查询

1、分组查询简介

分组查询是对数据按照某个或多个字段进行分组。
// 分组查询格式
SELECT column
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition] // 过滤条件为聚合函数,使用having
[ORDER BY column];
聚合函数只能出现在SELECT列表、HAVING子句和ORDER BY子句中,不能出现在WHERE子句中。如果要限制分组结果,只能使用HAVING子句。
使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅允许是被分组的列,或是为每个分组返回一个值的表达式,例如用一个列名作为参数的聚合函数。
Where子句:从数据源去掉不符合搜索条件的数据;
GROUP BY子句:分组,使用统计函数(聚合函数)为每组计算统计值;
HAVING子句:在分好的组中去掉每组中不符合条件的数据行。

2、使用聚合函数查询

COUNT()函数
select class,COUNT(*) from TStudent group by class;
SUM()函数
查询每个学生总分
select concat(a.StudentID,' ',a.sname) ss,SUM(b.mark) from TStudent a join TScore b on a.StudentID=b.StudentID group by ss;
AVG()函数
统计每个班平均分
Select class,AVG(mark) from TStudent a join TScore b on a.StudentID=b.StudentID group by class;

3、多字段分组

统计每班每科平均分,需要按两列分组class和subJectName
select class,subJectName,AVG(mark) from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID group by class,subJectName;

4、使用HAVING过滤分组

查询平局分大于80的学生
select concat(a.StudentID,' ',a.sname) ss,avg(b.mark) m from TStudent a join TScore b on a.StudentID=b.StudentID group by ss having m>80;

5、GROUP BY和ORDER BY使用

查找平均分大于80分,按平均分排序。
select concat(a.StudentID,' ',a.sname) ss,avg(b.mark) m from TStudent a join TScore b on a.StudentID=b.StudentID group by ss having m>80 order by m;

6、在GROUP BY子句中使用WITH ROLLUP

使用GROUP BY的WITH ROLLUP子句可以检索出更多的分组聚合信息,不仅仅可以检索出各组的聚合信息,还能检索出本组类的整体聚合信息。
select class,subJectName,AVG(mark) from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID group by class,subJectName with rollup;
能够统计每班每科的平均成绩,每班的平均成绩也能统计,全部班级的全部课程平均成绩也能统计。

五、子查询

1、带IN关键字的子查询

IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,数据列里的值将提供给外层查询语句进行比较操作。
select * from TStudent where studentid in (select distinct studentid from TScore where mark>98);

2、带EXISTS关键字的子查询

EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断子查询是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
select from TStudent where studentid='01001' and exists (select from TScore where studentid='01001');

3、带ANY、SOME关键字的子查询

ANY和SOME关键字是同义词,表示满足其中任一条件,允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
select from TStudent where studentid=any (select distinct studentid from TScore where mark>98)
等价于
select
from TStudent where studentid=some (select distinct studentid from TScore where mark>98);
等价于
select from TStudent where studentid in (select distinct studentid from TScore where mark>98);
子查询时还可以使用其他的比较运算符,如<、<=、=、>=和!=等。
以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00010学号大的学生。
select
from TStudent where studentid>some (select distinct studentid from TScore where mark>98)
以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00061学号小的学生。
select * from TStudent where studentid&lt;some (select distinct studentid from TScore where mark&gt;98);

4、带ALL关键字的子查询

ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内层查询的条件。
以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00010学号小的学生。
select * from TStudent where studentid&lt;all (select distinct studentid from TScore where mark&gt;98)
以下SQL语句子查询查出考试成绩大于98的学生的studentid,比如查出的结果有三个‘00010’,‘00021’,‘00061’,外查询将会查询比00061学号大的学生。
select * from TStudent where studentid>all (select distinct studentid from TScore where mark>98);

六、使用正则表达式查询

正则表达式作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许指定用正则表达式过滤SELECT检索出的数据。
在SQL查询语句中,查询条件REGEXP后所跟的东西作为正则表达式处理。

1、查询以特定字符或字符串开头的记录

字符‘^’匹配以特定字符或者字符串开头的文本。
select * from TStudent where sname regexp '^刘平';

2、查询以特定字符或字符串结尾的记录

字符‘$’匹配以特定字符或者字符串结尾的文本。
select * from TStudent where cardid regexp '36$';

3、用符号"."来替代字符串中的任意一个字符

字符‘.’匹配任意一个字符。
select * from TStudent where sname regexp '.康.';

4、使用"*"和"+"来匹配多个字符

星号‘’匹配前面的字符任意多次,包括0次。
加号‘+’匹配前面的字符至少一次。
找出×××以19开始,以6结束的学生
select
from TStudent where cardid regexp '^19.6$'
找出×××号中有123的学生
select
from TStudent where cardid regexp '.123+.';

5、匹配指定字符串

正则表达式可以匹配指定字符串,只要匹配字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符‘|’隔开。
select * from TStudent where sname regexp '武|尹|罗';

6、匹配指定字符中的任意一个

方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。不支持汉字。
select from TStudent where email regexp '[w-z]';
select
from TStudent where cardid regexp '^[1-3,7]';

7、匹配指定字符以外的字符

“[^字符集合]”匹配不在指定集合中的任何字符。
select * from TStudent where cardid regexp '^[^1-7]';

8、使用{M}或者{M,N}来指定字符串连续出现的次数

“字符串{n,}”表示至少匹配n次前面的字符。“字符串{n,m}”表示匹配前面的字符串不少于n次,不多于m次。
查找×××中出现138并且后面有8位0-9的数字的学生。
select * from TStudent where cardid regexp '138[0-9]{15}';

转载于:https://blog.51cto.com/9291927/2092195

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

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

相关文章

使用生成器创建新的迭代模式

一个函数中需要有一个 yield 语句即可将其转换为一个生成器。 def frange(start, stop, increment):x startwhile x < stop:yield xx incrementfor i in frange(0, 4, 2):print(i) # 0 2 一个生成器函数主要特征是它只会回应在迭代中使用到的 next 操作 def cutdata(n):p…

前端异常捕获与上报

在一般情况下我们代码报错啥的都会觉得 下图 然后现在来说下经常用的异常 1.try catch 这个是比较常见的异常捕获方式通常都是 使用try catch能够很好的捕获异常并对应进行相应处理&#xff0c;不至于让页面挂掉&#xff0c;但是其存在一些弊端&#xff0c;比如需要在捕获异常的…

Codeforces 924D Contact ATC (看题解)

Contact ATC 我跑去列方程&#xff0c; 然后就gg了。。。 我们计每个飞机最早到达时间为L[ i ], 最晚到达时间为R[ i ]&#xff0c; 对于面对面飞行的一对飞机&#xff0c; 只要他们的时间有交集则必定满足条件。 对于相同方向飞行的飞机&#xff0c; 只有其中一个的时间包含另…

基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能

NextQRCode ZXing开源库的精简版 **基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能原文博客 附源码下载地址** 与原ZXingMini项目对比 NextQRCode做了重大架构修改&#xff0c;原ZXingMini项目与当前NextQRCode不兼容 dependencies {compile com.gith…

flask sqlalchemy 单表查询

主要内容: 1 sqlalchemy: 一个python的ORM框架 2 使用sqlalchemy 的流程: 创建一个类 创建数据库引擎 将所有的类序列化成数据表 进行增删改查操作 # 1.创建一个 Class from sqlalchemy.ext.declarative import declarative_base Base declarative_base() # Base 是 ORM模型 基…

如何在Windows 7或Vista上安装IIS

If you are a developer using ASP.NET, one of the first things you’ll want to install on Windows 7 or Vista is IIS (internet information server). Keep in mind that your version of Windows may not come with IIS. I’m using Windows 7 Ultimate edition. 如果您…

Dubbo的使用及原理浅析

https://www.cnblogs.com/wang-meng/p/5791598.html转载于:https://www.cnblogs.com/h-wt/p/10490345.html

ThinkPHP3.2 实现阿里云OSS上传文件

为什么80%的码农都做不了架构师&#xff1f;>>> 0、配置文件Config&#xff0c;加入OSS配置选项&#xff0c;设置php.ini最大上传大小&#xff08;自行解决&#xff0c;这里不做演示&#xff09; OSS > array(ACCESS_KEY_ID > **************, //从OSS获得的…

ipad和iphone切图_如何在iPhone,iPad和Mac上签名PDF

ipad和iphone切图Khamosh PathakKhamosh PathakDo you have documents to sign? You don’t need to worry about printing, scanning, or even downloading a third-party app. You can sign PDFs right on your iPhone, iPad, and Mac. 你有文件要签名吗&#xff1f; 您无需…

一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。...

a. 图片懒加载&#xff0c;滚动到相应位置才加载图片。 b. 图片预加载&#xff0c;如果为幻灯片、相册等&#xff0c;将当前展示图片的前一张和后一张优先下载。 c. 使用CSSsprite&#xff0c;SVGsprite&#xff0c;Iconfont、Base64等技术&#xff0c;如果图片为css图片的话。…

[function.require]: Failed opening required 杰奇cms

在配置杰奇cms移动端的时候&#xff0c;出现了[function.require]: Failed opening required 不要慌&#xff0c;百度一下即可解决。这个就是权限问题。由于移动端要请求pc端的文件&#xff0c;没权限。加上一个iis_iusrs读写权限即可搞定&#xff01;转载于:https://www.cnblo…

在Ubuntu服务器上打开第二个控制台会话

Ubuntu Server has the native ability to run multiple console sessions from the server console prompt. If you are working on the actual console and are waiting for a long running command to finish, there’s no reason why you have to sit and wait… you can j…

Cloudstack系统配置(三)

系统配置 CloudStack提供一个基于web的UI&#xff0c;管理员和终端用户能够使用这个界面。用户界面版本依赖于登陆时使用的凭证不同而不同。用户界面是适用于大多数流行的浏览器包括IE7,IE8,IE9,Firefox Chrome等。URL是:(用你自己的管理控制服务器IP地址代替) 1http://<ma…

.NET Core 3.0-preview3 发布

.NET Core 3.0 Preview 3已经发布&#xff0c;框架和ASP.NET Core有许多有趣的更新。这是最重要的更新列表。 下载地址 :https://aka.ms/netcore3download 。.NET Core 3.0的更新&#xff1a;C&#xff03;中对索引和范围的更多支持支持.NET Standard 2.1。以.NET Standard项目…

如何在Chrome工具栏中固定和取消固定扩展程序

Not all extensions are made equal. Some extensions, like Grammarly, work quietly in the background and don’t need an icon in the Chrome toolbar. Here’s how to pin and unpin extensions for a cleaner Chrome toolbar. 并非所有扩展名都相等。 某些扩展程序(例如…

vim编辑器快捷操作

1、查找 进入编辑器 按下 / 进行查找&#xff0c;回跳到第一个匹配的值&#xff0c;按下n查找下一个 N返回查看上一个 也可根据正则进行查找 2、替换 &#xff1a;s/a/b/g 当前行替换 &#xff1a;%s/a/b/g 全文替换 &#xff1a;5,10s/a/b/g 区域替换: .,2s/foo/bar/g 当…

react-navigation 跨 tabs 返回首页

2019独角兽企业重金招聘Python工程师标准>>> react-navigation 跨 tabs 返回首页 import { NavigationActions } from react-navigation;const navigationAction NavigationActions.reset({ index: 0,actions: [ NavigationActions.navigate({ routeName: RootTab…

MySql:从任何主机授予根用户登录权限

Note that this is Not very secure, and should only be used for a local development box where you don’t feel like setting up individual permissions, but still need to connect from other machines. 请注意&#xff0c;这不是很安全&#xff0c;仅应用于您不想设置…

ubuntu 默认命令行_从命令行在Ubuntu上设置默认浏览器

ubuntu 默认命令行Ubuntu Linux has a default browser functionality that will automatically launch the correct browser when clicking on a link in a gnome gui application. It’s easy enough to set the default browser using the GUI tools, but sometimes it’s e…

ThreadLocal就是这么简单

前言 今天要研究的是ThreadLocal&#xff0c;这个我在一年前学习JavaWeb基础的时候接触过一次&#xff0c;当时在baidu搜出来的第一篇博文ThreadLocal&#xff0c;在评论下很多开发者认为那博主理解错误&#xff0c;给出了很多有关的链接来指正(可原博主可能没上博客了&#xf…