MySQL数据库——多表操作
文章目录
- 前言
- 多表关系
- 一对一关系
- 一对多/多对一关系
- 多对多关系
- 外键约束
- 创建外键约束
- 插入数据
- 删除带有外键约束的表的数据
- 删除外键约束
- 多表联合查询
- 数据准备
- 交叉连接查询
- 内连接查询
- 外连接查询
- 左外连接查询
- 右外连接查询
- 满外连接查询
- 子查询
- 子查询关键字
- ALL 关键字
- ANY 和 SOME 关键字
- IN 关键字
- EXISTS 关键字
- 自关联查询
前言
在日常的数据库使用过程中,我们处理的数据不只是单张表,而是需要我们同时处理多个表的数据,那么今天我将为大家分享关于MySQL的多表操作。
多表关系
在学习多表操作之前,我们需要知道有哪些多表关系:一对一关系、一对多关系/多对一关系、多对多关系。
一对一关系
一对一关系是指一个表的一条记录只能对应另外一个表的一条记录,它们之间通过共同的主键或唯一键进行关联。
一对多/多对一关系
多表一对多或多对一关系是指一个表的一条记录可以对应另一个表的多条记录,它们之间通过共同的主键或外键进行关联。
多对多关系
多表多对多关系是指两个或多个表之间相互关联,并且每个表的记录可以对应其他表的多个记录。处理多表多对多关系的常见方法是使用中间表(关联表)来连接关系。
外键约束
MySQL外键约束是一种数据库约束,用于确保表之间的关系的完整性。它定义了一个字段或一组字段在一个表中的值必须与另一个表中的值保持一致,或满足特定条件。
外键约束通过指定一个外键关系,将一个表的字段(称为外键)与另一个表的主键或唯一键(称为参照键)进行关联。这样,如果某个表中的外键值发生改变,MySQL会自动检查参照表中是否存在匹配的键值,以保持数据的一致性。
外键约束有以下几个作用:
- 强制引用完整性:外键约束确保表中的数据在引用时存在于关联表中。
- 维护数据一致性:外键约束防止在关联表中删除或修改数据时,引发不一致的结果。
- 提供查询优化:MySQL优化器可以使用外键关系来加速查询操作。
- 级联操作:外键约束可以定义级联操作,当参照表中的数据更新或删除时,自动对关联表中的数据进行相应操作。
MySQL外键约束具有以下特点:
-
强制引用完整性:外键约束确保引用表中的数据在被引用表中存在,防止出现无效的引用。这可以保证数据的一致性和完整性。
-
自动验证和维护关系:MySQL会自动验证和维护外键约束,确保关联的数据被正确更新、插入或删除。如果违反了外键约束,MySQL会报错并拒绝执行操作。
-
支持级联操作:外键约束可以定义级联操作,在参照表中进行删除或更新操作时,自动对关联表中相关的数据进行相应操作。例如,可以实现级联删除,删除参照表中的数据时,同时删除关联表中的相关数据。
-
优化查询性能:MySQL优化器可以使用外键约束来优化查询操作。通过正确设置外键关系,MySQL可以更有效地执行JOIN操作,提高查询性能。
-
可以禁用和启用:需要时,可以禁用或启用外键约束,以允许执行某些需要暂时违反外键约束的操作。这个特性在某些情况下很有用,但需要谨慎使用,以防止数据不一致。
-
对数据完整性的依赖:使用外键约束可以在数据库级别维护数据完整性,而不是依赖于应用程序。这样可以减少错误和数据不一致的可能性,使数据库更加可靠。
创建外键约束
MySQL 创建外键约束有两种方式:1.在创建表的时候创建外键约束:create table 表名(列名1 类型,列名2 类型,constraint 外键名 foreign key(列名) references 主表(主表列名);
2.在创建表之后创建外键约束:alter table 表名 add constraint 外键名 foreign key(列名) referrnces 主表(主表列名);
我们在创建表之后添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。
在创建表的时候创建外键约束
create table class(class_id int primary key,name varchar(10)); -- 主表
insert into class values(1,'高三1班'), (2,'高三2班'),(3,'高三3班');create table student(class_id int,student_id int,name varchar(20),gender varchar(10),constraint student_fk foreign key(class_id) references class(class_id));
创建表之后添加外键约束
create table class(class_id int primary key,name varchar(10)); -- 主表
insert into class values(1,'高三1班'), (2,'高三2班'),(3,'高三3班');create table student(class_id int,student_id int,name varchar(20),gender varchar(10));alter table student
add constraint student_fk
foreign key(class_id) references class(class_id);
插入数据
当我们插入数据的时候,如果我们先向主表中插入数据的时候,不需要注意什么,但是当我们向从表中插入数据的时候我们需要注意:插入的记录的外键列的数据在主表的主键列中是否存在,如果存在,则插入成功,否则就插入失败。所以建议:插入数据的时候先向主表中插入数据,然后再向从表中插入数据。
insert into student values(1,2301,'张三','男');
insert into student values(4,2302,'王五','男');
如果我们在新建外键约束的时候,表中已经存在了数据该怎么办?
create table student(class_id int,student_id int,name varchar(20),gender varchar(10));insert into student values(1,2301,'张三','男'),(3,2302,'王五','男');
-- 我们插入的数据都是与主键列中的数据相对应alter table student
add constraint student_fk
foreign key(class_id) references class(class_id);
上面存在的数据外键列与主键列中的数据是相对应的,所以插入成功。
create table student(class_id int,student_id int,name varchar(20),gender varchar(10));insert into student values(1,2301,'张三','男'),(4,2302,'王五','男');
-- 这里class_id 4 在主键列中并不存在,我们看看是否能
alter table student
add constraint student_fk
foreign key(class_id) references class(class_id);
这里class_id 4 在主键列中并不存在,所以插入失败。
删除带有外键约束的表的数据
如果我们需要删除带有外键约束的表中的数据该怎么办呢?
- 删除从表中的数据可以随便删除
- 当我们删除主表中的数据时,我们需要注意:我们删除的记录的主键列还被外键列所依赖时,不能删除。
此时主键列 1 还被外键列依赖着,我们删除试试。
delete from class where class_id = 1;
删除失败,所以我们删除主表的数据时,需要考虑该记录的主键列是否还被外键列依赖着。在删除数据的时候建议先删除从表中的数据,然后再删除主表中未被依赖的数据
删除外键约束
但我们不需要外键约束的时候,我们也可以删除外键约束。alter table 表名 drop foreign key 外键名;
此时外键约束已删除。
多表联合查询
多表查询是 MySQL 操作中最重要也是使用最多的操作,所以我们需要学好 MySQL 多表查询操作。
MySQL多表查询是指在一个查询语句中涉及到多个表,通过指定表之间的连接条件(关联条件)来获取联合数据的过程。多表查询可以用来检索、过滤和组合来自多个表的数据。
MySQL多表操作主要包括:
- 交叉连接查询
- 内连接查询
-
- 隐式内连接(SQL92标准)
-
- 显式内连接(SQL99标准)
- 外连接
-
- 左外连接
-
- 右外连接
-
- 满外连接
- 子查询
- 自关联查询
并且我们实行的是查询操作,外键约束不会对多表查询造成影响。
数据准备
我们为后面的多表查询准备数据。
use mydb3;
-- 创建部门表
create table if not exists dept3(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字
);-- 创建员工表
create table if not exists emp3(eid varchar(20) primary key , -- 员工编号ename varchar(20), -- 员工名字age int, -- 员工年龄dept_id varchar(20) -- 员工所属部门
);-- 给dept3表添加数据
insert into dept3 values('1001','研发部');
insert into dept3 values('1002','销售部');
insert into dept3 values('1003','财务部');
insert into dept3 values('1004','人事部');-- 给emp3表添加数据
insert into emp3 values('1','乔峰',20, '1001');
insert into emp3 values('2','段誉',21, '1001');
insert into emp3 values('3','虚竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','扫地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鸠摩智',50, '1002');
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');
交叉连接查询
MySQL交叉连接查询(Cross
Join)是一种用于从两个或多个表中返回所有可能的组合的查询方式。它会返回左边表的每一行与右边表的每一行的所有组合,并且不使用任何连接条件。因此,交叉连接查询会产生一个结果集,其行数等于左边表的行数乘以右边表的行数
select * from 表1,表2
交叉连接查询实际上就是多个表之间进行 笛卡尔积 。
两个分别有m和n条记录的表进行笛卡尔积之后会出现 m*n 条记录。
select * from dept3,emp3;
但是我们看到笛卡尔积之后的表的数据会发现有很多不适合的记录,所以我们还需要对笛卡尔积生成的表做出筛选。
内连接查询
MySQL内连接查询(Inner Join)是一种用于从两个或多个表中返回满足连接条件的记录集的查询方式。内连接基于指定的连接条件,将两个表中的行进行匹配,并返回匹配的行。
内连接是最常用的连接类型,它可以帮助我们在多个表之间建立关联关系,并获取相关的数据。内连接的结果集只包含匹配的行,因此可以根据连接条件进行数据的关联和过滤,提供更具体和有意义的结果。
隐式内连接:select * from 表A,表B where 条件;
显式内连接:select * from 表A inner join B on 条件;
inner 可省略。
MySQL还支持两张以上的表进行多表操作:select * from 表A join B on 条件 join C on 条件...;
隐式内连接
select * from dept3,emp3 where dept3.deptno = emp3.dept_id;
-- 如果两张表的列相同,可使用 表名.列名 来区分
显式内连接
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;
外连接查询
MySQL外连接(Outer
Join)是一种用于从两个或多个表中返回满足连接条件以及一些或全部不满足连接条件的记录的查询方式。外连接可以帮助我们获取主表和连接表之间的关系,并包含未匹配的行。
外连接查询分为:
- 左外连接查询
- 右外连接查询
- 满外连接查询
左外连接查询
MySQL左外连接查询(Left Outer
Join)是一种通过从左边表(主表)返回所有行以及满足连接条件的右边表(连接表)的匹配行,来获取表之间关联数据的查询方式。左外连接会保留左边表中的所有行,即使在右边表中没有匹配的行。
左外连接会将左边表的每一行与右边表的匹配行进行连接,并返回匹配的结果集。如果右边表中没有匹配的行,则返回NULL值。
select * from 表A left outer join 表B on 条件;
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;
这里因为人事部没有员工,但因为是左外连接,要显示左表中的所有数据,所以人事部中的数据就用 NULL 填充。
右外连接查询
MySQL右外连接查询(Right Outer Join)是一种通过从右边表(连接表)返回所有行以及满足连接条件的左边表(主表)的匹配行,来获取表之间关联数据的查询方式。右外连接会保留右边表中的所有行,即使在左边表中没有匹配的行。
右外连接会将右边表的每一行与左边表的匹配行进行连接,并返回匹配的结果集。如果左边表中没有匹配的行,则返回NULL值。
select * from 表A right outer join 表B on 条件;
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
1005 没有对应的部门,所以使用 NULL 填充。
左外连接可以根据两个表互换位置来实现相互之间的转换。
select * from emp3 left outer join dept3 on dept3.deptno = emp3.dept_id;
满外连接查询
满外连接是一种同时返回左边表和右边表中的所有行,以及满足连接条件的匹配行的查询方式。它能够获取左右两个表的全部数据并关联它们。
满外连接实际上就是将右外连接的数据拼接到左外连接数据的下面或者是将左外连接的数据拼接到右外连接数据的下面。
但是MySQL不支持满外连接 full outer join
,我们可以用 union
来实现满外连接 。并且 union
满外连接还有两种方式:左外连接 union 右外连接;
去重满外连接 ,左外连接 union all 右外连接;
不去重满外连接。
去重满外连接
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id
union
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
不去重满外连接
select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id
union all
select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
子查询
MySQL子查询(Subquery)是指在一个SQL查询中嵌套另一个完整的SQL查询。子查询可以像普通的查询一样包含SELECT、FROM、WHERE等子句,并且可以返回一个结果集,这个结果集可以在外部查询中直接使用。
子查询通常用于将复杂的查询分解为更小的、可管理的查询块,并通过嵌套来达到更灵活和精确的查询目的。它可以嵌套在SELECT、FROM、WHERE等子句中,用于过滤、排序、计算和联合数据。
子查询可以返回的数据类型分为四种:
- 单列单行:返回的是一个具体列的内容,可以理解为一个单值数据。
- 单行多列:返回一行数据中多个列的内容
- 多行多列:返回多行记录之中同一列的内容,相当于给出了一个操作范围。
- 多行多列:查询返回的结果是一张临时表。
如果我们需要知道某个部分有哪些人,我们是不是需要先知道这个部门所代表的部门编号,因为员工信息表中存储的是部门编号,知道了部门编号之后我们才能找出有哪些人。
-- 查询销售部有哪些人
select deptno from dept3 where name = '销售部';
当我们知道了部门编号之后我们再在员工表中找出部门编号为1002的人的信息。
select ename from emp3 where dept_id = 1002;
因为 select deptno from dept3 where name = '销售部';
的结果为1002,所以我们可以直接把这个查询嵌套进 select ename from emp3 where dept_id = 1002;
中,也就是 select ename from emp3 where dept_id = (select deptno from dept3 where name = '销售部');
select ename from emp3
where dept_id = (select deptno from dept3 where name = '销售部'); -- 返回单行单列
查询研发部和销售部人的信息。
select eid,ename from emp3
where dept_id
in (select deptno from dept3 where name in ('研发部','销售部'));
-- 查询研发部30岁以下的员工信息,包括员工号,员工名字,部门名字
select eid,ename,name from (select * from emp3 where age < 30) t1
join (select * from dept3 where name = '研发部') t2
on t1.dept_id = t2.deptno;
因为最终要求显示员工号、员工名字、部门名字,这些数据分别在两个表中,所以我们需要将两个表联合起来,并且需要对每张表中的数据做出判断。
子查询关键字
在子查询中有一些常用的逻辑关键字:
- ALL 关键字
- ANY 关键字
- SOME 关键字
- IN 关键字
- EXISTS 关键字
ALL 关键字
在MySQL中,关键字ALL可以用于子查询中,用于比较子查询返回的结果与外部查询条件进行比较。
关键字ALL与子查询配合使用时,表示外部查询条件必须与子查询返回的所有值进行比较,只有当外部查询条件大于或小于子查询中的所有值时,才被视为满足条件。
select ... from ... where c > all(查询语句);
-- 查询员工表中年龄大于1003部门所有员工的年龄的信息
select * from emp3 where age > all(select age from emp3 where dept_id = 1003);
-- 查询不属于任何部门的员工的信息
select * from emp3 where dept_id != all(select deptno from dept3);
ANY 和 SOME 关键字
在MySQL中,ANY和SOME关键字可以与子查询一起使用,用于比较外部查询条件与子查询返回的结果集中的任意一个值进行比较。
这两个关键字的作用是类似的,它们都表示外部查询条件只需与子查询返回的结果集中的任意一个值相匹配即可判断为满足条件。
select ... from ... where c > any/some(查询语句);
-- 查询年龄大于1003部门任何一个员工的员工信息
select * from emp3 where age > any(select age from emp3 where dept_id = 1003);
IN 关键字
IN关键字用于检查外部查询条件是否与子查询结果集中的任意一个值相匹配。如果外部查询条件与子查询结果集中的某个值匹配,则被视为满足条件。
select ... from ... where c in(查询语句);
-- 查询部门为研发部和销售部的员工的信息
select * from emp3
where dept_id
in (select deptno from dept3 where name = '研发部' or name = '销售部');
EXISTS 关键字
EXISTS关键字用于判断子查询是否有结果,如果存在结果,则被视为满足条件,会执行前面的查询语句,如果子查询没有结果,则被视为不满足条件,不执行前面的查询。
select ... from ... where exists(查询语句);
假设我们要查询年龄大于60岁的员工的信息。
-- 查询年龄大于60岁的员工信息
select * from emp3 where exists (select * from emp3 where age > 60);
会发现,这里将所有员工的信息都显示出来了,这是为什么呢?因为在 EXISTS 后面的子查询中,查找的对象是emp3 的整个表,所以每次的查询都有结果,所以emp3中的所有信息都打印了,那么我们应该怎么办呢?
我们可以形象的将MySQL的查询过程看作是一条记录一条记录的筛选,所以我们可以使用表别名,然后用表别名来判断每一条记录的员工的年龄是否大于60。
-- 查询年龄大于60岁的员工信息
select * from emp3 t where exists (select * from emp3 where t.age > 60);
使用exists的情况大多也可使用in,但是我们推荐使用exists,因为MySQL底层exists做了优化,查询效率更高。
自关联查询
MySQL自关联查询是指在查询中使用同一个表进行连接操作,创建一个虚拟的关联。在自关联查询中,可以将表视为两个或多个不同的表,并在查询中引用它们。
自关联查询通常涉及到在查询中使用表的别名,以便可以引用同一个表的不同实例。这样可以通过列与自身的比较来建立关联关系。
自关联查询在处理具有层级结构、关系链等的数据时非常有用,常见的应用场景包括获取管理层级关系、查找相关的记录、获取亲属关系等。
MySQL自查询必须得使用别名,否则就会出现错误
我们准备一些自关联用到的数据。
create table t_sanguo(eid int primary key,ename varchar(20),manager_id int,foreign key (manager_id) references t_sanguo (eid));insert into t_sanguo values(1,'刘协',NULL),(2,'刘备',1),(3,'关羽',2),(4,'张飞',2),(5,'曹操',1),(6,'许褚',5),(7,'典韦',1),(8,'孙权',1),(9,'周瑜',8),(10,'鲁肃',8);
我们需要显示出每个人对应的上级信息。
select t1.ename,t2.ename manager
from t_sanguo t1 join t_sanguo t2
on t1.manager_id = t2.eid;
我们还应该显示出刘协的上级信息,所以我们使用左外连接。
select t1.ename,t2.ename manager
from t_sanguo t1 left join t_sanguo t2
on t1.manager_id = t2.eid;
相关文章:

MySQL数据库——多表操作
文章目录 前言多表关系一对一关系一对多/多对一关系多对多关系 外键约束创建外键约束插入数据删除带有外键约束的表的数据删除外键约束 多表联合查询数据准备交叉连接查询内连接查询外连接查询左外连接查询右外连接查询满外连接查询 子查询子查询关键字ALL 关键字ANY 和 SOME 关…...

Java版本spring cloud + spring boot企业电子招投标系统源代码 tbms
功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为…...

css实现,正常情况下div从左到右一次排列,宽度超出时,右侧最后一个div固定住,左侧其他div滚动
需求:正常情况下 宽度超出时: 实现: <templete><div class"jieduanbox"><div v-for"(item, index) in stageList" :key"index" style"display: inline-block">.......</div><div class"rightBtn&q…...
【Linux手动搭建Sftp,创建用户、用户组及删除用户】
SFTP (Secure File Transfer Protocol)是一种安全的文件传输协议,基于SSH协议进行加密传输。在进行文件传输时,SFTP客户端通过SSH协议与服务器进行连接,并且通过使用公钥和/或密码进行身份验证,从而确保传输…...

云上 Index:看「简墨」如何为云原生打造全新索引
拓数派首款数据计算引擎 PieCloudDB Database 是一款全新的云原生虚拟数仓。为了提升用户使用体验,提高查询效率,在实现存算分离的同时,PieCloudDB 设计与打造了全新的存储引擎「简墨」等模块,并针对云场景和分析型场景设计了高效…...

Linux安装cuda和cudnn教程
Linux安装cuda和cudnn教程 文章目录 1.下载cuda和cudnn2. 安装cuda并检验安装是否成功3. 安装cudnn4.验证cuda是否能用代码附件:解压各种格式文件的Linux命令参考文献 卸载之前的cuda 卸载之前的cuda教程 1.下载cuda和cudnn CUDA下载地址:https://dev…...

短视频矩阵源码
一、短视频矩阵源码搭建解析: 目录 一、短视频矩阵源码搭建解析: 二、短视频矩阵源码的开发路径分享: 三、短视频矩阵系统开发应具备哪些能力? 短视频技术开发能力: 开发人员应具备短视频相关技术能力,…...
群狼调研—连锁化妆品品牌门店神秘顾客调查的行家
连锁化妆品品牌门店神秘顾客调查作为群狼调研(湖南专业市场调查)的优势业务之一,公司成立至今已承包包括北京、上海、广州、深圳、长沙在内全国多个城市上百家不同化妆品品牌客户的神秘顾客调查服务,在创新性、行业操守及客户服务等方面赢得了广大客户的…...

C# 回文链表
234 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入&…...

基于freertos的温湿度蓝牙系统
前言:本项目主要是基于freertos的小项目,目的是为了巩固近期学习的知识,功能较简单,可自行扩充。 一、项目基本架构 项目基本功能:通过STM32单片机的freertos操作系统,将温湿度数据显示在oled屏幕上&#…...

华为云CTS 使用场景
云审计服务 CTS 云审计服务(Cloud Trace Service),帮助您监控并记录华为云账号的活动,包括通过控制台、API、开发者工具对云上产品和服务的访问和使用行为,提供对各种云资源操作记录的收集、存储和查询功能࿰…...

【css】nth-child选择器实现表格的斑马纹效果
nth-child() 选择器可以实现为所有偶数(或奇数)的表格行添加css样式,even:偶数,odd:奇数。 代码: <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…...

找视频素材就上这8个网站,免费可商用,马住了。
自媒体创作者,视频剪辑一定要知道这8个高质量视频素材网站,免费可商用,赶紧收藏! 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富,网站主要还是以设计类素材为主,高清视…...

Springboot部署ELK实战
Springboot部署ELK实战 1、部署docker、docker-compose环境安装docker安装docker-compose 2、搭建elk1、构建目录&&配置文件1、docker-compose.yml 文档2、Kibana.yml3、log-config.conf 2、添加es分词器插件3、启动 3、Springboot项目引入es、logStash配置1、引入依赖…...
【Leetcode】76.最小覆盖子串(困难)
一、题目 1、题目描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存…...

C++ 指针函数和函数指针
除了void类型的函数之外,函数在调用结束之后都要有返回值,指针也可以是函数的返回值。当一个函数的返回值是指针类型时,这个函数就是指针型函数。 使用指针型函数的最主要目的就是要在函数结束时把大量的数据从被调函数返回到主调函数中。而通…...
JAVA实现存在更新不存在插入与及多余的进行删除(三)
这个版本,主要是迭代重载了下save方法,不废话,直接上代码: /*** 保存数据,处理数据的增删改** param paramData 前台的参数* param dbData 后台的数据* param clazz 前后台参数对应的class* param beanName …...

iMX6ULL驱动开发 | OLED显示屏SPI驱动实现(SH1106,ssd1306)
周日业余时间太无聊,又不喜欢玩游戏,大家的兴趣爱好都是啥?我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏,一直在吃灰,何不把玩一把?于是说干就干,最后在我的imax6ul的lin…...

拥抱创新:用Kotlin开发高效Android应用
拥抱创新:用Kotlin开发高效Android应用 引言 在当今数字时代,移动应用已经成为人们生活中不可或缺的一部分。无论是社交媒体、电子商务还是健康管理,移动应用已经深刻地影响了我们的生活方式。随着移动设备的普及和功能的增强,A…...
Effective Java笔记(20)接口优于抽象类
Java提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从Java 8为继承引入了缺省方法( default method),这两种机制都允许为某些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,类必须成…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

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