【MySQL联合查询】轻松实现数据关联
1、联合查询
联合查询又称为多表查询,它的基本执行过程就是笛卡尔积
1.1 认识笛卡尔积
那么什么是笛卡尔积呢?
答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到一个新的行。
举例说明笛卡尔积:
假设我们现在有两张表分别为学生信息表和班级信息表

现在我们把这两张表进行笛卡尔积操作:

笛卡尔积相当于乘法运算,列数是两个表列数之和,行数是两个表行数之积
注:笛卡尔积执行后产生的结果大多是无效的,此时我们就可以采用条件进行筛选
1.2 笛卡尔积进行多表查询
接下来我们就来试一下如何进行笛卡尔积操作:
首先创建两张表,分别为上述的学生信息表和班级信息表,创建完两张表后并给它们添加上述表中的内容
select * from student;
+----+------+---------+
| id | name | classid |
+----+------+---------+
| 1 | 张三 | 1 |
| 2 | 李四 | 2 |
| 3 | 王五 | 1 |
+----+------+---------+
select * from class;
+---------+-----------+
| classid | classname |
+---------+-----------+
| 1 | 舞蹈班 |
| 2 | 跆拳道班 |
+---------+-----------+
然后对这两张表进行笛卡尔积操作
select * from student,class;
+----+------+---------+---------+-----------+
| id | name | classid | classid | classname |
+----+------+---------+---------+-----------+
| 1 | 张三 | 1 | 1 | 舞蹈班 |
| 1 | 张三 | 1 | 2 | 跆拳道班 |
| 2 | 李四 | 2 | 1 | 舞蹈班 |
| 2 | 李四 | 2 | 2 | 跆拳道班 |
| 3 | 王五 | 1 | 1 | 舞蹈班 |
| 3 | 王五 | 1 | 2 | 跆拳道班 |
+----+------+---------+---------+-----------+
上述的笛卡尔积执行后产生的结果大多数是无效的,此时我们就可以采用条件进行筛选
当 student 表中的 classid 和 class 表中的 classid 相等时,则这条数据是有效的数据
select * from student,class where classid = classid;
ERROR 1052 (23000): Column 'classid' in where clause is ambiguous
如果直接用 classid = classid 则会报错,因为它无法分辨哪个classid 和 哪个 classid 进行比较
select * from student,class where student.classid = class.classid;
+----+------+---------+---------+-----------+
| id | name | classid | classid | classname |
+----+------+---------+---------+-----------+
| 1 | 张三 | 1 | 1 | 舞蹈班 |
| 2 | 李四 | 2 | 2 | 跆拳道班 |
| 3 | 王五 | 1 | 1 | 舞蹈班 |
+----+------+---------+---------+-----------+
那么此时就可以采用 表名.列名 的方式进行区分
注:多表查询除了可以加上连接条件外,还可以加上其他条件
多表查询出来用 from 多个表加逗号分隔 来连接多个表外,还可以用 join on 来连接,还可以是 inner join on
join on 实现多表查询:
select * from student join class on student.classid = class.classid;
+----+------+---------+---------+-----------+
| id | name | classid | classid | classname |
+----+------+---------+---------+-----------+
| 1 | 张三 | 1 | 1 | 舞蹈班 |
| 2 | 李四 | 2 | 2 | 跆拳道班 |
| 3 | 王五 | 1 | 1 | 舞蹈班 |
+----+------+---------+---------+-----------+
join 连接的是两个表,on 后面跟的是连接条件
inner join on 实现多表查询:
select * from student inner join class on student.classid = class.classid;
+----+------+---------+---------+-----------+
| id | name | classid | classid | classname |
+----+------+---------+---------+-----------+
| 1 | 张三 | 1 | 1 | 舞蹈班 |
| 2 | 李四 | 2 | 2 | 跆拳道班 |
| 3 | 王五 | 1 | 1 | 舞蹈班 |
+----+------+---------+---------+-----------+
inner join on 其实跟 join on 一样,此处不做过多解释
from 多个表 和 join on 的主要区别:
from 多个表只能实现内连接
join on 既可以实现内连接也可以实现外连接
1.3 内连接和外连接
内连接 和 外连接的主要区别:
当连接的两个表里面的数据是一一对应的时候,内连接和外连接其实就没啥区别
当连接的两个表里面的数据不是一一对应的时候,内连接和外连接就有区别了
1.3.1 两张表一一对应
现在有两张表,分别为 student 学生表 和 score 成绩表:
select * from student;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+----+------+
select * from scoretable;
+-----------+-------+
| studentId | score |
+-----------+-------+
| 1 | 97 |
| 2 | 86 |
| 3 | 73 |
+-----------+-------+
id 和 studentId 是一一对应的,所有内连接和外连接没什么区别
内连接:
select * from student,scoreTable where student.id = scoretable.studentId;
+----+------+-----------+-------+
| id | name | studentId | score |
+----+------+-----------+-------+
| 1 | 张三 | 1 | 97 |
| 2 | 李四 | 2 | 86 |
| 3 | 王五 | 3 | 73 |
+----+------+-----------+-------+
外连接:
select * from student join scoreTable on student.id = scoretable.studentId;
+----+------+-----------+-------+
| id | name | studentId | score |
+----+------+-----------+-------+
| 1 | 张三 | 1 | 97 |
| 2 | 李四 | 2 | 86 |
| 3 | 王五 | 3 | 73 |
+----+------+-----------+-------+
1.3.2 两张表不一一对应
现在有两张表,分别为 student 学生表 和 score 成绩表:
select * from student;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+----+------+
select * from scoretable;
+-----------+-------+
| studentId | score |
+-----------+-------+
| 1 | 97 |
| 2 | 86 |
| 6 | 73 |
+-----------+-------+
现在我们可以看到 student 中的 id 为 3 的在 scoretable 中没有对应的 studentId
内连接:
select * from student,scoreTable where student.id = scoretable.studentId;
+----+------+-----------+-------+
| id | name | studentId | score |
+----+------+-----------+-------+
| 1 | 张三 | 1 | 97 |
| 2 | 李四 | 2 | 86 |
+----+------+-----------+-------+
当进行内连接的时候因为student中的id为3 的和scoretable中的studentId为6的不匹配所以就被筛除了没有查询出来
外连接:
当两张表不是一一对应的时候,外连接又可以分为 左外连接 和 右外连接
左外连接:left join on
select * from student left join scoreTable on student.id = scoretable.studentId;
+----+------+-----------+-------+
| id | name | studentId | score |
+----+------+-----------+-------+
| 1 | 张三 | 1 | 97 |
| 2 | 李四 | 2 | 86 |
| 3 | 王五 | NULL | NULL |
+----+------+-----------+-------+
左外连接会把左表的结果尽量显示出来,如果右表中没有对应的记录,就使用NULL填充
右外连接:right join on
select * from student right join scoreTable on student.id = scoretable.studentId;
+------+------+-----------+-------+
| id | name | studentId | score |
+------+------+-----------+-------+
| 1 | 张三 | 1 | 97 |
| 2 | 李四 | 2 | 86 |
| NULL | NULL | 6 | 73 |
+------+------+-----------+-------+
右外连接会把右表的结果尽量显示出来,如果左表中没有对应的记录,就使用NULL填充
1.4 自连接
自连接:自己和自己进行笛卡尔积
自连接使用场景:当行与行进行比较时,就可以使用自连接,将行转成列进行比较
现在有两张表,分别为 scoretable 和 course
scoretable 表:
select * from scoretable;
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
| 70 | 1 | 1 |
| 96 | 1 | 2 |
| 97 | 1 | 3 |
| 80 | 2 | 1 |
| 92 | 2 | 2 |
| 86 | 2 | 3 |
| 91 | 3 | 1 |
| 76 | 3 | 2 |
| 77 | 3 | 3 |
+-------+------------+-----------+
course 表:
select * from course;
+----+------+
| id | name |
+----+------+
| 1 | 语文 |
| 2 | 数学 |
| 3 | 英语 |
+----+------+
现在我们要查询哪些同学的语文成绩比英语成绩低
首先自连接,将行转换成列:
select * from scoretable,scoretable;
ERROR 1066 (42000): Not unique table/alias: 'scoretable'
自己跟自己连接名字不能重复
那表名不能重复,那还如何自连接呢?
答:可以起别名,起别名不光可以对列,还可以对表
select * from scoretable as s1,scoretable as s2;
自连接排列组合的时候会产生大量无效的数据,所有就需要指定连接条件
指定连接条件,将有效数据筛选出来:
select * from scoretable as s1,scoretable as s2
where s1.student_id = s2.student_id;
自连接的时候只有当 student_id 相等时才表示有效数据
添加条件,将左边表的语文成绩和右边表的英语成绩查询出来:
有效成绩查询出来后,就需要加上条件查询出左边的语文成绩和右边的英语成绩
select * from scoretable as s1,scoretable as s2
where s1.student_id = s2.student_id
and s1.course_id = 1 and s2.course_id = 3;
+-------+------------+-----------+-------+------------+-----------+
| score | student_id | course_id | score | student_id | course_id |
+-------+------------+-----------+-------+------------+-----------+
| 70 | 1 | 1 | 97 | 1 | 3 |
| 80 | 2 | 1 | 86 | 2 | 3 |
| 91 | 3 | 1 | 77 | 3 | 3 |
+-------+------------+-----------+-------+------------+-----------+
这样就将左侧的语文成绩查询出来了,右侧的英语成绩查询出来了
添加条件,将语文成绩比英语成绩低的同学查询出来:
接下来就要查询哪些同学的语文成绩比英语成绩低
select * from scoretable as s1,scoretable as s2
where s1.student_id = s2.student_id
and s1.course_id = 1 and s2.course_id = 3 and s1.score < s2.score;
+-------+------------+-----------+-------+------------+-----------+
| score | student_id | course_id | score | student_id | course_id |
+-------+------------+-----------+-------+------------+-----------+
| 70 | 1 | 1 | 97 | 1 | 3 |
| 80 | 2 | 1 | 86 | 2 | 3 |
+-------+------------+-----------+-------+------------+-----------+
2 rows in set (0.00 sec)
这样就把语文成绩比英语成绩低的学生信息查询出来了
1.5 子查询
子查询:把多个 SQL 组合成一个
在实际开发中,子查询得慎用。因为子查询可能会构造出非常复杂,非常不好理解的 SQL。
写代码一般要么追求可读性和可维护性,要么追求程序的运行速度
1.5.1 单行子查询
单行子查询:返回一行记录的子查询
student 表:
select * from student;
+----+----------+------+
| id | class_id | name |
+----+----------+------+
| 1 | 1 | 张三 |
| 2 | 1 | 李四 |
| 3 | 2 | 王五 |
| 4 | 3 | 赵六 |
| 5 | 2 | 王七 |
+----+----------+------+
现在查询“张三”的同班同学,根据 class_id 进行查询
分开查询:
//查询出张三的class_id
select class_id from student where name = '张三';
+----------+
| class_id |
+----------+
| 1 |
+----------+
//查询出来的张三的class_id为 1,再查询除了张三以外的class_id 为1的同学
select * from student where class_id = 1 and name != '张三';
+----+----------+------+
| id | class_id | name |
+----+----------+------+
| 2 | 1 | 李四 |
+----+----------+------+
单行子查询:
select * from student where
class_id = ( select class_id from student where name = '张三')
and name != '张三';
+----+----------+------+
| id | class_id | name |
+----+----------+------+
| 2 | 1 | 李四 |
+----+----------+------+
1.5.2 多行子查询
多行子查询:返回多行记录的子查询
scoretable 表:
select * from scoretable;
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
| 70 | 1 | 1 |
| 96 | 1 | 2 |
| 97 | 1 | 3 |
| 80 | 2 | 1 |
| 92 | 2 | 2 |
| 86 | 2 | 3 |
| 91 | 3 | 1 |
| 76 | 3 | 2 |
| 77 | 3 | 3 |
+-------+------------+-----------+
course 表:
select * from course;
+----+------+
| id | name |
+----+------+
| 1 | 语文 |
| 2 | 数学 |
| 3 | 英语 |
+----+------+
查询每位同学的“语文”“英语”课程的成绩信息
普通查询:
//首先查询出语文和英语成绩对应的id
select id from course where name = '语文' or name = '英语';
+----+
| id |
+----+
| 1 |
| 3 |
+----+
//再根据查询出来的语文英语对应的id,在 scoretable表中查询
select * from scoretable where course_id = 1 or course_id = 3;
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
| 70 | 1 | 1 |
| 97 | 1 | 3 |
| 80 | 2 | 1 |
| 86 | 2 | 3 |
| 91 | 3 | 1 |
| 77 | 3 | 3 |
+-------+------------+-----------+
多行子查询:
select * from scoretable where course_id
in(select id from course where name = '语文' or name = '英语');
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
| 70 | 1 | 1 |
| 97 | 1 | 3 |
| 80 | 2 | 1 |
| 86 | 2 | 3 |
| 91 | 3 | 1 |
| 77 | 3 | 3 |
+-------+------------+-----------+
1.5.3 合并查询
合并查询:就是将两个查询结果集,合并成一个
在实际应用中,为了合并多个查询的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致
union操作符
union操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中的重复行
course 表:
select * from course;
+----+------+
| id | name |
+----+------+
| 1 | 语文 |
| 2 | 数学 |
| 3 | 英语 |
| 6 | 化学 |
| 7 | 物理 |
+----+------+
现在查询 id 小于等于 2 或者 name 为 "英文" 的课程信息
select * from course where id <= 2 union select * from course where name = '英语';
+----+------+
| id | name |
+----+------+
| 1 | 语文 |
| 2 | 数学 |
| 3 | 英语 |
+----+------+
看到这里大家可能有个疑问,明明可以用 or 也能实现,为什么还要用 union?
答:用 or 查询只能时来自于同一个表,如果用 union 查询可以时来自于不同的表,子要查询的结果列匹配即可,匹配就是列的类型一样、列的一样、列的名字一样
union all 操作符
union all 操作符用于取得两个结果集的并集,当使用该操作符时,不会去掉结果集中的重复行
select * from course where id < 3 union all select * from course where name = '数学';
+----+------+
| id | name |
+----+------+
| 1 | 语文 |
| 2 | 数学 |
| 2 | 数学 |
+----+------+
相关文章:

【MySQL联合查询】轻松实现数据关联
1、联合查询 联合查询又称为多表查询,它的基本执行过程就是笛卡尔积 1.1 认识笛卡尔积 那么什么是笛卡尔积呢? 答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到…...

Windows安装Ubuntu双系统
Windows安装Ubuntu双系统 1.下载Ubuntu 16.04,地址https://releases.ubuntu.com/16.04/ 2.下载Rufus,地址https://rufus.ie/zh/ 3.准备U盘,烧录系统 4.磁盘分区 5.重启,按住shift键 本人电脑是联想小新 Windows11系统࿰…...
【大数据之Hadoop】三十四、Hadoop综合调优之小文件优化方法
1 Hadoop小文件弊端 HDFS上每个文件都要在NameNode上创建对应的元数据,这个元数据的大小约为150byte,这样当小文件比较多的时候,就会产生很多的元数据文件,一方面会大量占用NameNode的内存空间,另一方面就是元数据文件…...

周赛 Round#3 题解
又不能放图片,又不能写学校,你让我怎么办啊!! 系列文章目录 1.周赛 Round#1 2.周赛 Round#2 前言 这是周赛第三轮。//涉及隐私原因,博文里不放题目,要看的去http://0241:101:610:801.22222 划分字符串贪…...

详解HTTPS加密过程
目录 前言 HTTPS是什么 HTTPS的工作过程 引入对称加密 引入非对称加密 引入证书 总结 前言 对于HTTP上篇文章已经做了详细的解释了。众所周知,HTTPS要比HTTP要安全,但是为什么HTTPS要比HTTP安全呢? 这篇文章主要研究HTTPS的加密机制…...

聚观早报 | ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备
今日要闻:ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备;索尼正开发小尺寸折叠屏手机;万达辟谣大规模裁员;智能仿生手让截肢者重获手心的温度 ChatGPT登顶美区iOS免费榜 ChatGPT 在 iOS 美区免费 App 排行榜上位列…...

position:sticky-粘性吸附布局
一、描述 就是在一个滚动的容器里,将一个子元素设置为postion:sticky 在元素显示在可视区域内,显示的效果与position:relative 一致,当元素被滑动出可视区域外是,显示效果与position:fixed一致 二、注意事项 1、父元素需要存在滚动(overflow:auto&…...

【MySQL】-【数据库的设计规范】
文章目录 为什么需要数据库设计范式范式简介范式都包括哪些键和相关属性的概念第一范式(1st NF)第二范式(2nd NF)第三范式(3rd NF) 反范式化概述应用举例反范式化的新问题反范式的适用场景 BCNF(巴斯范式)案例案例一案例二 第四范式案例案例一案例二 第五范式、域键范式范式的实…...
全面解析缓存应用经典问题
1、前言 随着互联网从简单的单向浏览请求,发展为基于用户个性信息的定制化以及社交化的请求,这要求产品需要做到以用户和关系为基础,对海量数据进行分析和计算。对于后端服务来说,意味着用户的每次请求都需要查询用户的个人信息和…...

Java版本企业电子招采系统源码——信息数智化招采系统
信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stre…...

Rust每日一练(Leetday0005) 罗马数字、公共前缀、三数之和
目录 13. 罗马数字转整数 Roman to Integer 🌟 14. 最长公共前缀 Longest Common Prefix 🌟 15. 三数之和 3Sum 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日…...
【告别校园,迎接未来】
作为一个曾经的大学生,我的四年大学时光充满了起伏和挑战。回顾这段时光,我深刻认识到了自己的不足,同时也感悟了一些珍贵的人生经验和收获。 我是一个比较内向的人,进入大学后感觉有些孤独,难以适应新的环境和生活方…...

SaaS系统用户权限设计
SaaS系统用户权限设计 学习目标: 理解RBAC模型的基本概念及设计思路 了解SAAS-HRM中权限控制的需求及表结构分析完成组织机构的基本CRUD操作 完成用户管理的基本CRUD操作完成角色管理的基本CRUD操作 组织机构管理 需求分析 需求分析 实现企业组织结构管理࿰…...

我们为什么还要学习Altium Designer?
Altium Designe(简称“AD”)是电子设计领域中备受推崇的软件工具之一,拥有强大的功能和灵活的设计环境,也是要用最广泛的EDA工具之一,为电子工程师提供了无限可能,但很多工程师学完AD基本操作就转投其他EDA…...

Q1业绩整体回暖,影视行业找到增长新路径
凛冬已过,影视行业恢复了生机。 数据显示,今年一季度,影视院线板块全部上市公司分别实现营收、归母净利111.86亿元、10.15亿元,同比增幅为1.44%和53.76%。在经济复苏的背景下,影视行业实现了扭亏为盈和跨越式增长。 …...

Zabbix
概述 作为一个运维,需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等,利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器…...

OpenHarmony支持HDMI接口声卡适配说明
高清多媒体接口(High Definition Multimedia Interface,HDMI )是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设…...
AtCoder Beginner Contest 300G - P-smooth number解题报告
AtCoder Beginner Contest 300G - P-smooth number解题报告 1 题目链接 传送门 2 题目大意 题目:P-光滑数的数量 题目大意: 在 1 1 1 到 n n n 中,有多少个数的所有质因数均不超过 p ( p ≤ 100 ) p\ (p\leq100) p (p≤100)。 3 解…...

数据分析与预处理常用的图和代码
1.训练集和测试集统计数据描述之间的差异作图: def diff_color(x):color red if x<0 else (green if x > 0 else black)return fcolor: {color}(train.describe() - test.describe())[features].T.iloc[:,1:].style\.bar(subset[mean, std], alignmid, colo…...

Http与Https 比较
目录 1、HTTP(HyperText Transfer Protocol:超文本传输协议) 2、HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议) 3、HTTP 与 HTTPS 区别 4、HTTPS 的工作原理 1、HTTP(HyperTex…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...