当前位置: 首页 > news >正文

初识MySQL · 复合查询(内外连接)

目录

前言:

基本查询回顾

笛卡尔积和子查询

笛卡尔积

内外连接

子查询

单行子查询

多行子查询

多列子查询

from中使用子查询

合并查询


前言:

在前文我们学习了MySQL的基本查询,就是简单的套用了select语句,最多不过是加上了一些聚合函数,使用了group by或者是having等。

但是对于MySQL语句来说,查询往往是最复杂的,比如在一次查询中我们可能涉及到多个表的查询,那么我们是如何将这些有关联的表连接在一起的呢?我们是如果将表连接之后使用筛选条件和聚合函数查询出我们想要的内容呢?

以上就是我们今天要解决的问题了,那么废话不多说,我们直接进入主题!

在学习之前,我们使用的是Oracle的9i经典测试表进行讲解的:

CREATE TABLE EMP (EMPNO INT PRIMARY KEY,          -- 雇员编号ENAME VARCHAR(100),             -- 雇员姓名JOB VARCHAR(100),               -- 岗位MGR INT,                        -- 上级领导编号HIREDATE DATE,                  -- 入职日期SAL DECIMAL(10, 2),             -- 工资COMM DECIMAL(10, 2),            -- 提成DEPTNO INT                      -- 部门编号
);INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES
(7839, 'KING', 'PRESIDENT', NULL, '1990-06-09', 5000, NULL, 10),
(7566, 'JONES', 'MANAGER', 7839, '1990-04-02', 2975, NULL, 10),
(7698, 'BLAKE', 'MANAGER', 7839, '1990-06-12', 2850, NULL, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1990-05-14', 2450, NULL, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1990-07-13', 3000, NULL, 20),
(7902, 'FORD', 'ANALYST', 7566, '1990-12-05', 3000, NULL, 20),
(7844, 'TURNER', 'SALESMAN', 7698, '1995-06-04', 1500, 0, 30),
(7900, 'JAMES', 'CLERK', 7698, '1996-06-23', 950, NULL, 30),
(7654, 'MARTIN', 'SALESMAN', 7698, '1998-12-05', 1250, 1400, 30),
(7499, 'ALLEN', 'SALESMAN', 7698, '1998-06-04', 1600, 300, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1996-02-22', 1250, 500, 30),
(7934, 'MILLER', 'CLERK', 7782, '2000-01-21', 1300, NULL, 10);

这是EMP表。

CREATE TABLE DEPT (DEPTNO INT PRIMARY KEY,         -- 部门编号DNAME VARCHAR(100),             -- 部门名称LOC VARCHAR(100)                -- 部门地址
);INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');

这是DEPT表。

CREATE TABLE SALGRADE (GRADE INT PRIMARY KEY,          -- 工资等级LOSAL DECIMAL(10, 2),           -- 最低工资HISAL DECIMAL(10, 2)            -- 最高工资
);INSERT INTO SALGRADE (GRADE, LOSAL, HISAL) VALUES
(1, 700, 1200),
(2, 1201, 1400),
(3, 1401, 2000),
(4, 2001, 3000),
(5, 3001, 9999);

这是SALGRADE表。

好了,有了以上的准备,我们就开始吧!


基本查询回顾

对于基本查询我们简单回顾几个题目就可以了:

显示每个部门的平均工资和最高工资

显示平均工资低于2000的部门号和它的平均工资

显示工资最高的员工的名字和工作岗位

显示每个部门的平均工资和最高工资:

因为我们要求的是每个部门的平均工资,显然我们要将不同部门的人分开来,那么肯定是要用group by分组的,分了组之后,我们可以根据聚合函数avg和max求得我们需要的信息:

select DEPTNO,avg(SAL)平均工资,max(SAL)最高工资 from EMP group by DEPTNO;

显示平均工资低于2000的部门号和它的平均工资:

同样,因为我们是根据部门来确认平均工资,那么聚合函数是跑不掉的,但是这道题和上面的题目不同的是多了一个筛选条件,那么无非是加个having的事儿:

select DEPTNO,AVG(SAL)平均工资 from EMP group by DEPTNO having 平均工资<2000;

显示工资最高的员工的名字和工作岗位:

如果我们读题只读一半的话,那么我们是很容易把前半句查出来的,显示工资最高的,无非就是max一下,找到了我们再用SAL对照看一下,对照出来了之后,我们再从EMP表里面去找即可,那么在这里我们相当于要查询两次,一次查询工资最高是多少,一次通过最高工资查询这个人的名字和工作岗位:

select ENAME,DEPTNO from EMP where sal=(select max(SAL) from EMP);

到这里,已经开始逐渐有了多表查询的影子了,或者说已经有了子表查询的影子了。

那么我们就趁热打铁,直接进入到下一阶段吧!


笛卡尔积和子查询

到这里,肯定有人会好奇说,笛卡尔积不是数学中的东西吗,怎么在MySQL中也有这个东西,那多正常,一个名字多处复用嘛。

好了,对于笛卡尔积我们也不解释,我们就只记住一句话,笛卡尔积是两张表互相乘的结果,这两张表可以是同一张表

具体的乘法就是A表中的每行和B表中的每行进行逐步相乘,所以假设A表有N行,B表有M行,那么它们的笛卡尔积的结果就是N*M行,那么其中必定伴随了冗余的数据,所以需要我们加入对应的连接条件。其实到笛卡尔积这里我们也就是在学习内外连接,不过欲听后事如何,且看后面。

笛卡尔积

咱们单说概念没有意思,我们直接用题目讲解即可。

显示雇员名、雇员工资以及所在部门的名字:

对于EMP表中明显有的是雇员名,雇员工资,但是并没有所在部门的名字,部门名是DEPT表中才有的,所以明显这个查询结果是要联合两张表查询的。

那么这里因为是第一次见,我就直接给代码然后再解释了:

select ENAME,SAL,DNAME from EMP, DEPT where EMP.DEPTNO=DEPT.DEPTNO;select EMP.ENAME,EMP.SAL,DEPT.DNAME from EMP, DEPT where EMP.DEPTNO=DEPT.DEPTNO;
NO;

这里可以发现我们有两种写法,一种是类似于C++结构体访问符的写法,一种是直接选择,那么为什么两种写法都可以呢?因为我们要查询的元素在都是独一无二的,也就是在其他表里面没有,比如在EMP表中有ENAME,在SALGRADE和DEPT中都没有,所以我们不用指定。其它同理。

那么当我们给这两个表做了笛卡尔积之后,我们是一定要用where筛选出来结果的,不然数据直接错乱,筛选的条件就是我们通过这两个表共同的数据让它们连接在一起。

这种结果可能更像一种拼接,我们可以用拼接的视角来看待笛卡尔积。

显示部门号为10的部门名,员工名和工资:

对于这道题目来说,我们可以先思考哪些元素是表里面有的,哪些元素是表里面没有的,比如部门名是DEPT里面的,员工名和工资都是EMP里面的,也就是意味着我们要连接这两个表,但是这道题目与上面一道题目不一样的是这道题目多了一个条件,即只要部门号为10的,那么我们将表拼接之后where选择一下就可以了。

select DEPT.DNAME,EMP.ENAME,EMP.SAL from EMP,DEPT 
where EMP.DEPTNO=DEPT.DEPTNO and EMP.DEPTNO=10;

显示各个员工的姓名,工资,及工资级别:

这道题目同理,我们经过分析可以知道姓名和工资是EMP独有的,工资级别是SALGRADE独有的,所以我们要连接的两张表就是这两张了,那么它们的连接条件是什么呢?

因为它们看起来好像并没有什么col是一样的,那么就需要我们额外的去筛选了

select GRADE,ENAME,SAL from EMP, SALGRADE where SAL between LOSAL and HISAL;

我们手动筛选,即我们要让工资符合条件即可,不能让工资的档位随意浮动是吧。

自连接)显示员工WARD的上级领导的编号和姓名

这道题目我们实际上是有两种方式来做的,一种是子查询,即我们先把WARD的领导的编号查到,然后再select他对应的编号和姓名。

但是如果我们将EMP看作两张表,一张表用作员工表,一张表用作领导表,分别查询似乎也是可以的,就像

select leader.EMPNO,leader.ENAME from EMP as worker, EMP as leader 
where worker.MGR=leader.EMPNO and worker.ENAME='WARD';

到这里我们算是简单的了解完了笛卡尔积了,而我们还发现了一些有意思的,比如做笛卡尔积的两张表我们可以重命名,这样可以防止命名冲突。

内外连接

对于内外连接来说其实就是做笛卡尔积,不过这个看起来更加的规范,因为本文的主题算是笛卡尔积吧,所以本文的写法除了这里都是笛卡尔积的写法。

对于内外连接来说,内连接就是我们刚才的,不管三七二十一,两张表做一个乘法,不过这里换了关键字,用的是inner join,题目是显示SMITH的名字和部门名称,我们用标准的内连接来写这个的话就是:

select ENAME,DEPT.DNAME from EMP inner join DEPT on EMP.DEPTNO=DEPT.DEPTNO  
where EMP.ENAME='SMITH';

我们可以注意到我们是将原本的连接where替换成了on,并且在EMP和DEPT中间加了一个inner join,代表的就是内连接。

同理,外连接分为两种,一种是左外连接,一种是右外连接,它们没有差别,因为这两个外连接可以完美的相互转化,不过是交换一下位置的事儿而已。

语法只是把inner join换成了left join和 right join而已。

查询所有雇员的姓名、工资以及他们所在的部门名称。如果某个雇员没有部门,也需要显示雇员的信息。

通过题目我们可以得知外连接的作用就是让某一张表的信息全部显示,即便连接之后这张表的某行和某列来说都是要完整显示的,所以我们拿这个题举例,代码为

SELECT EMP.ENAME, EMP.SAL, DEPT.DNAME
FROM EMP
LEFT JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

当然了,这里的效果不明显,因为数据都是比较完整的,所以没有显示NULL的情况。

当然了,你要想写右外连接也是可以的,咱们直接换个位置,,,对吧,所以内外连接没有那么神奇,就是谁厉害,谁显示的多一点,谁就当主表而已。

子查询

显示员工WARD的上级领导的编号和姓名

没错,还是这道题目,不过我们这道题目可以使用子查询的方法来做,无非就是先查出来WARD的领导是谁,然后再到EMP表中进行查找即可:

select ENAME,EMPNO from EMP where EMPNO=(select MGR from EMP where ENAME='WARD');

我们的基本思路就是先搞清楚内层select要干嘛,我们得先找到WARD领导的EMPNO才能找到对应的信息吧?而领导的EMPNO恰好是WRAD的MGR,所以我们就能通过子查询找到对应的EMPNO,那这样不就手到擒来了吗?

不过对于子查询来说分为了以下几个部分:

单行子查询

对于单行子查询来说,就是子查询的结果只有一行,比如这道题。

显示SMITH同一部门的员工

我们要知道和SMITH同一部门的员工,我们得知道SMITH是什么员工吧?所以我们先利用子查询把SMITH的部门查出来,就一行,我们利用这行数据,从EMP表里面找一样的即可

select ENAME,DEPTNO from EMP 
where DEPTNO=(select DEPTNO from EMP where ENAME='SMITH');

多行子查询

同理,对于多行子查询来说,就是子查询返回的结果有多行,比如这道题:

查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

要查询上面的信息,我们就应该查询处10号的工作岗位是什么,可能有多个,所以我们应该使用的关键字是in

select ENAME,JOB,SAL,DEPTNO from EMP 
where JOB in (select JOB from EMP whereDEPTNO=10) and DEPTNO<>10;

那么对于多行子查询类似的题目有这几个,大家伙可以自己试试:

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门 的员工)

多列子查询

这个就是子查询返回的结果是多列的,那么有人问了,是否存在有多列多行的呢?有,但是不是很常见,所以这里只演示前面三个。我们还是通过题目来介绍它:

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

select * from EMP 
where (DEPTNO,JOB)=(select DEPTNO,JOB from EMP where ENAME='SMITH') and ENAME<>'SMITH';

不过因为这个表里面没有完全相同的,所以查询出来的结果也是空的。

接下来最难的一部分就来了,大家要先有一个概念即MySQL中一切皆表。为什么这么说呢?你看查出来的所有的东西,它难道不是一个表吗?无非是这个表的行和列多与少的关系,那么既然查出来的东西是表,我们是否可以让它和别的表做笛卡尔积?当然是可以的,也可以让它单独作为一张表来查询,那么就引出来了今天的这个话题,from中使用子查询。

from中使用子查询

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

首先我们解析题目,显示每个高于自己部门平均工资的员工的什么什么,那么我们是否应该先把自己部门工资的平均工资求出来,我们才好进行下一步比较。

那么求出来对应的平均工资我们肯定是要通过分组聚合的,有了这个平均工资表之后,我们将这两个表做笛卡尔积,之后我们的条件的是要大于平均工资,所以连接条件写好之后and加上另一个判断也是必不可少的。

这个相对来说是比较难的,所以同学们可能会绕一会儿。

select EMP.ENAME,EMP.DEPTNO,EMP.SAL,平均工资 
from EMP, (select DEPTNO,avg(SAL)平均工资 from EMP group by DEPTNO) TMP 
where EMP.DEPTNO=TMP.DEPTNO and EMP.SAL>平均工资;

查找每个部门工资最高的人的姓名、工资、部门、最高工资

同理,这个是求的最高工资,我们就直接给代码了,思路和上面的完全一样

select EMP.ENAME,EMP.SAL,EMP.DEPTNO,最高工资 
from EMP, (select max(SAL) 最高工资, DEPTNO from EMP group by DEPTNO) TMP 
where EMP.DEPTNO=TMP.DEPTNO and EMP.SAL=TMMP.最高工资;

显示每个部门的信息(部门名,编号,地址)和人员数量

既然我们是要求每个部门的人员数量,那么我们不妨先分组聚合,把每个部门的人员数量求出来。

求出来了之后,我们就拥有了一张包含人员数量和对应部门的表,我们可以将这个表作为子表,然后和DEPT表进行笛卡尔积,通过DEPTNO查找即可。

select DEPT.DEPTNO,DEPT.DNAME,DEPT.LOC,人员数量 
from DEPT, (select DEPTNO,count(*)nt(*)人员数量 from EMP group by DEPTNO)TMP 
where DEPT.DEPTNO=TMP.DEPTNO;

select DEPT.dname, DEPT.deptno, DEPT.loc,count(*) '部门人数' from EMP, 
DEPTwhere EMP.deptno=DEPT.deptnogroup by DEPT.deptno,DEPT.dname,DEPT.loc;

这个是多表查询的方法,也是可以的,不过需要注意的是分组的时候应该是部门信息都是一组的。

合并查询

搞了这么多难的,我们终于可以整个轻松的了,就学两个,一个是union,一个是union all,前者在并集的基础上去重,后者在并集的基础上不去重。

将工资大于2500或职位是MANAGER的人找出来

 select ename, sal, job from EMP where sal>2500 union select ename, sal, job from EMP where job='MANAG'
 select ename, sal, job from EMP where sal>2500 union all select ename, sal, job from EMP where job='MANAG

没啥好说的,非常非常简单,就是将查询结果并起来就行了。


感谢阅读!

相关文章:

初识MySQL · 复合查询(内外连接)

目录 前言&#xff1a; 基本查询回顾 笛卡尔积和子查询 笛卡尔积 内外连接 子查询 单行子查询 多行子查询 多列子查询 from中使用子查询 合并查询 前言&#xff1a; 在前文我们学习了MySQL的基本查询&#xff0c;就是简单的套用了select语句&#xff0c;最多不过是…...

Devops系列之对接Gerrit的设计与实现(三)-- Java编程实现

一、背景 上文讲述了如何使用shell命令实现创建gerrit项目&#xff0c;本文介绍如何使用java语言编程实现。 二、java语言实现 1、引入jar包 <dependency><groupId>com.urswolfer.gerrit.client.rest</groupId><artifactId>gerrit-rest-java-client…...

深入理解全排列算法:DFS与回溯的完美结合

全排列问题是算法中的经典问题&#xff0c;其目标是将一组数字的所有可能排列组合列举出来。本文将详细解析如何通过深度优先搜索&#xff08;DFS&#xff09;和回溯法高效生成全排列&#xff0c;并通过模拟递归过程帮助读者彻底掌握其核心思想。 问题描述 给定一个正整数 n&a…...

服务器(一种管理计算资源的计算机)

服务器是在网络环境中提供计算能力并运行软件应用程序的特定IT设备&#xff0c;它在网络中为其他客户机&#xff08;如个人计算机、智能手机、ATM机等终端设备&#xff09;提供计算或者应用服务, 一般来说服务器都具备承担响应服务请求、承担服务、保障服务的能力。服务器相比普…...

时态--02--一般过去时

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一般过去时1.肯定句am/is — wasare — were 2.否定句3.⼀般疑问句4.特殊疑问句5.there be 过去式 practice过去分词 一般过去时 1.肯定句 am/is — was are — wer…...

WSA(Windows Subsystem for Android)安装LSPosed和应用教程

windows安卓子系统WSA的Lsposed和shamiko的安装教程 WSA(Windows Subsystem for Android)安装LSPosed和应用教程 一、环境准备 在开始之前,请确保: 已经安装好WSA(Windows Subsystem for Android)已经安装好ADB工具下载好LSPosed和Shamiko框架安装包 二、连接WSA 首先需要…...

Opencv计算机视觉编程攻略-第十三节 跟踪视频中的物品

这是opencv系列的最后一节&#xff0c;主要学习视频序列&#xff0c;上一节介绍了读取、处理和存储视频的工具&#xff0c;本文将介绍几种跟踪图像序列中运动物体的算法。可见运动或表观运动&#xff0c;是物体以不同的速度在不同的方向上移动&#xff0c;或者是因为相机在移动…...

10 个最新 CSS 功能已在所有主流浏览器中得到支持

前言 CSS 不断发展&#xff0c;新功能使我们的工作更快、更简洁、更强大。得益于最新的浏览器改进&#xff08;Baseline 2024&#xff09;&#xff0c;许多新功能现在可在所有主要引擎上使用。以下是您可以立即开始使用的10 CSS新功能。 1. Scrollbar-Gutter 和 Scrollbar-Co…...

[特殊字符] 企业级Docker私有仓库实战:3步搭建Harbor安全仓库,镜像管理从此高效无忧

本文提供 一站式Docker私有仓库部署指南&#xff0c;聚焦企业级镜像管理需求&#xff0c;深入解析Harbor私有仓库的搭建、运维与安全加固全流程。内容涵盖 轻量级Registry快速部署与 Harbor企业级方案对比&#xff0c;手把手演示SSL证书配置、多租户权限控制、镜像漏洞扫描等核…...

一个基于Django的进销存管理系统Demo实现

第一步&#xff1a;创建 Django 项目 bash 复制 django-admin startproject inventory_system cd inventory_system python manage.py startapp erp 第二步&#xff1a;定义数据模型&#xff08;models.py&#xff09; python 复制 from django.db import models from d…...

wsl2+ubuntu22.04安装blender教程(详细教程)

本章教程介绍,如何在Windows操作系统上通过wsl2+ubuntu安装blender并运行教程。Blender 是一款免费、开源的 ​​3D 创作套件​​,广泛应用于建模、动画、渲染、视频编辑、特效制作等领域。它由全球开发者社区共同维护,支持跨平台(Windows、macOS、Linux),功能强大且完全…...

netty中的ChannelPipeline详解

Netty中的ChannelPipeline是事件处理链的核心组件,负责将多个ChannelHandler组织成有序的责任链,实现网络事件(如数据读写、连接状态变化)的动态编排和传播。以下从核心机制、执行逻辑到应用场景进行详细解析: 1. 核心结构与组成 双向链表结构 组成单元:ChannelPipeline…...

使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构

使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构 在现代应用程序中&#xff0c;实时数据处理和高并发性能是至关重要的。本文将介绍如何使用 Python 的多进程和 Socket 技术来接收和解析数据&#xff0c;并将处理后的数据推送到 Kafka&#xff0c;从而实现高效的…...

WinForm真入门(14)——ListView控件详解

一、ListView 控件核心概念与功能 ‌ListView‌ 是 WinForm 中用于展示结构化数据的多功能列表控件&#xff0c;支持多列、多视图模式及复杂交互&#xff0c;常用于文件资源管理器、数据报表等场景‌。 核心特点‌&#xff1a; 支持 ‌5种视图模式‌&#xff1a;Details&…...

FastAPI用户认证系统开发指南:从零构建安全API

前言 在现代Web应用开发中&#xff0c;用户认证系统是必不可少的功能。本文将带你使用FastAPI框架构建一个完整的用户认证系统&#xff0c;包含注册、登录、信息更新和删除等功能。我们将采用JWT&#xff08;JSON Web Token&#xff09;进行身份验证&#xff0c;并使用SQLite作…...

【BUG】阿里云服务器数据库远程连接报错

当你遇到 ERROR 2003 (HY000): Cant connect to MySQL server on 47.100.xxx.xx (10061) 错误&#xff0c;这个错误代码 10061 通常意味着客户端无法连接到指定的 MySQL 服务器&#xff0c;原因可能有多种&#xff0c;下面为你分析可能的原因及对应的解决办法。 1. 网络连接问…...

【前端】【React】性能优化三件套useCallback,useMemo,React.memo

一、总览&#xff1a;性能优化三件套 useCallback(fn, deps)&#xff1a;缓存函数&#xff0c;避免每次渲染都新建函数。useMemo(fn, deps)&#xff1a;缓存值&#xff08;计算结果&#xff09;&#xff0c;避免重复执行计算。React.memo(Component)&#xff1a;缓存组件的渲染…...

Vue3性能优化终极指南:编译策略、运行时调优与全链路监控

一、Vue3性能优化体系框架 1.1 性能优化全景图谱 1.2 关键性能指标定义表 指标测量方式优化目标核心影响因子FCPLighthouse<1.5s资源加载速度LCPPerformance API<2.5s关键资源大小TTIWebPageTest<3.5s主线程阻塞时间Memory UsageChrome DevTools<50MB对象引用策略…...

FISCO BCOS技术架构解析:从多群组设计到性能优化实践

目录 FISCO BCOS整体架构设计 多群组架构与数据隔离机制 交易流程与执行机制 安全架构与隐私保护 性能优化与压测实践 应用案例与生态工具 FISCO BCOS作为中国领先的金融级开源联盟链平台,自2017年由金链盟开源工作组推出以来,已在政务、金融、医疗、版权等众多领域实现…...

Ceph异地数据同步之- S3对象异地同步复制

#作者&#xff1a;闫乾苓 文章目录 关键组件说明数据流说明部署步骤配置主区域配置次要区域S3对象文件同步测试 关键组件说明 在Ceph RGW的多站点复制架构中&#xff0c;Realm、Zonegroup 和 Zone 是关键的组织结构&#xff0c;用于管理多站点的配置和数据同步 Realm(领域)&a…...

iOS按键精灵辅助工具在游戏开发中的创新应用

一、iOS自动化测试辅助工具 在移动游戏开发领域&#xff0c;iOS按键精灵类辅助工具不同于传统的安卓自动化方案&#xff0c;iOS环境下的自动化测试面临更严峻的技术挑战&#xff0c;但通过创新方法仍可实现精准控制。 # 基于图像识别的智能定位算法示例 def find_button(butt…...

3D案例丨多个3D工业相机拼接检测 开启360°新视界

在高速生产线上&#xff0c;经常需要在极短的时间内对工件进行全方位的外观检测&#xff0c;如&#xff1a;线缆直径和直线度检测、锂电池外观缺陷检测、铁轨截面尺寸检测等。 这需要传感器完整还原被测物的截面面轮廓形状&#xff0c;并获取精准的截面轮廓数据。但单一相机的…...

打分函数分类

在分子对接中&#xff0c;打分函数用于评估配体与受体结合的亲和力。不同类型的打分函数有各自的优势和应用场景。常见的打分函数主要分为以下几类&#xff1a; 1. 基于物理&#xff08;力场&#xff09;的打分函数 (Force/physics-field-based scoring functions) 这种打分…...

实践 DevOps 项目:使用 Terraform、Helm、SonarQube 和 GitLab CI/CD 在 AWS EKS 上实践全栈部署

在当今快节奏的软件开发领域&#xff0c;自动化至关重要。在本文中&#xff0c;我将向您展示如何构建一个全面的 DevOps 流水线&#xff0c;该流水线能够&#xff1a; 使用 Terraform 预置完整的 AWS 基础设施。部署一个包含私有子网和公共子网、RDS PostgreSQL 以及完整配置的…...

EFT干扰和共模干扰

EFT干扰本质上属于共模干扰的一种具体表现形式&#xff0c;但严格来说不能简单等同于共模干扰。以下从原理、特征及区别角度展开分析&#xff1a; 1. EFT干扰的原理 定义&#xff1a;EFT&#xff08;Electrical Fast Transient&#xff0c;电快速瞬变脉冲群&#xff09;干扰是…...

android 下提示 SQLITECIPHER driver not loaded

问题描述: 在android下出现 SQLITECIPHER driver not loaded 错误 解决办法: 在QT的Android目录下面放入 libplugins_sqldrivers_sqlitecipher_arm64-v8a.so...

[D1,2]回溯刷题

文章目录 组合 组合 回溯的基础结构 #组合总和 注意startIndex的更新是用i来更新的&#xff0c;不然会产生重复的组合...

使用 VBA 宏创建一个选择全部word图片快捷指令,进行图片格式编辑

使用 VBA 宏批量选择图片 ✅ 第一步&#xff1a;创建 .dotm 加载项文件 1、使用环境 office word 365&#xff0c;文件格式为.docx 图片格式为.PNG 2、创建 .dotm 加载项文件 打开 Word&#xff0c;新建一个空白文档。 按下 Alt F11 打开 VBA 编辑器。 点击菜单栏&#xff…...

SQL 关键字

SQL 包含许多关键字&#xff0c;这些关键字用于执行各种数据库操作。以下是主要的 SQL 关键字分类&#xff1a; 数据查询语言 (DQL) SELECT - 从数据库中选择数据 FROM - 指定要查询的表 WHERE - 指定查询条件 GROUP BY - 对结果集进行分组 HAVING - 对分组结果进行过滤 …...

从PPT到PNG:Python实现的高效PPT转图工具

从PPT到PNG&#xff1a;Python实现的高效PPT转图工具 在日常工作中&#xff0c;PPT&#xff08;PowerPoint&#xff09;文件是我们常用的演示工具。然而&#xff0c;有时候我们需要将PPT的内容提取为图片格式&#xff08;如PNG&#xff09;以便于展示或保存。手动将每一页PPT保…...

TCP和UDP协议

前言 TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种主要的传输层协议&#xff1b;它们在连接方式、可靠性、效率等方面有显著区别。 关键对比 差异总结 可靠性&#xff1a; TCP通过确认应答、重传等机制确保数据可靠传输&#…...

高并发内存池(三):PageCache(页缓存)的实现

前言&#xff1a; 在前两期内容中&#xff0c;我们深入探讨了内存管理机制中在 ThreadCache 和 CentralCache两个层级进行内存申请的具体实现。这两层缓存作为高效的内存分配策略&#xff0c;能够快速响应线程的内存需求&#xff0c;减少锁竞争&#xff0c;提升程序性能。 本期…...

使用pybind11开发可供python使用的c++扩展模块

在做紫微斗数程序的时候用到了padas库,不过也只用了它下面几个功能: 1、读入csv文件,构造DataFrame; 2、通过行列标题查找数据; 3、通过行标题读取一行数据。 用这几个功能却导入了pandas、numpy、dateutil、pytz等一堆库,多少有点划不来,于是想用c++开发一个实现这几…...

系统与网络安全------网络通信原理(5)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 传输层解析 传输层 传输层的作用 IP层提供点到点的连接传输层提供端到端的连接 端口到端口的连接&#xff08;不同端口号&#xff0c;代表不同的应用程序&#xff09; TCP协议概述 TCP&#xff08;Transm…...

JavaScript防抖与节流

目录 防抖&#xff08;Debounce&#xff09; 一、防抖的定义 二、防抖的实现原理 三、防抖的代码实现 四、代码解析 五、使用示例 1. 输入框实时搜索&#xff08;延迟执行模式&#xff09; 2. 按钮防重复点击&#xff08;立即执行模式&#xff09; 六、总结 节流&…...

Java网络编程实战(多人聊天室-CS模式)

一、C/S模式核心原理 1.1 基本架构 C/S&#xff08;Client/Server&#xff09;模式采用客户端-服务器架构&#xff1a; 服务器端&#xff1a;持续运行&#xff0c;负责消息路由和广播客户端&#xff1a;用户交互界面&#xff0c;连接服务器进行通信通信协议&#xff1a;TCP&…...

Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类

Vue3.5 Vite6.x 项目的完整 Stylelint 配置方案&#xff0c;支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类型 一、完整依赖安装 npm install --save-dev stylelint stylelint-config-standard postcss-html # 解析 Vue/HTML 文件中的样式postcss-scss …...

23种设计模式Java版(带脑图,带示例源码)

设计模式 1、创建型 1.1、单例模式(Singleton pattern) 确保一个类只有一个实例&#xff0c;并提供该实例的全局访问点。 1.2、工厂方法(Factory Method) 它定义了一个创建对象的接口&#xff0c;但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 1.3、抽象…...

mapbox高阶,使用graphology、graphology-shortest-path前端插件和本地geojson数据纯前端实现路径规划

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️graphology 插件1.3.1 ☘️概念1.3.2 ☘…...

【已解决】vscode升级后连接远程异常:“远程主机可能不符合XXX的先决条件”解决方法

vscode提示升级&#xff0c;每次都升了&#xff0c;突然某次关闭后无法连接远程&#xff0c;查询资料是因为从VS Code 1.86.1版本开始&#xff08;2024年1月&#xff09;要求glibc版本>2.28。 命令“ ldd --version”可查看glibc版本为2.27&#xff1a; rootXXXXXXX:~$ ld…...

Springboot整合JAVAFX

Springboot整合JAVAFX 实体与VO设计 pom.xml文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...

【算法】——一键解决动态规划

前言 动态规划是一种高效解决​​重叠子问题​​和​​最优子结构​​问题的算法思想。它通过​​分治记忆化​​&#xff0c;将复杂问题分解为子问题&#xff0c;并存储中间结果&#xff0c;避免重复计算&#xff0c;从而大幅提升效率。 ​​为什么重要&#xff1f;​ ​​优化…...

Git使用与管理

一.基本操作 1.创建本地仓库 在对应文件目录下进行&#xff1a; git init 输入完上面的代码&#xff0c;所在文件目录下就会多一个名为 .git 的隐藏文件&#xff0c;该文件是Git用来跟踪和管理仓库的。 我们可以使用 tree 命令&#xff08;注意要先下载tree插件&#xff09…...

npm、nvm、nrm

NVM (Node Version Manager) 常见指令 NVM 是一个用于管理 Node.js 版本的流行工具&#xff0c;允许你在同一台机器上安装和切换不同版本的 Node.js。以下是 NVM 的常见指令&#xff1a; 安装与卸载 nvm install <version> - 安装指定版本的 Node.js 例如&#xff1a;…...

Java 文件内容转换为MD5哈希值

若要把读取到的 files 列表里的内容转换为 MD5 哈希值&#xff0c;你可以逐个遍历 files 列表中的元素&#xff0c;将每个元素的内容计算成 MD5 哈希值。 以下是一个完整的 Java 示例代码&#xff0c;展示了如何实现这一功能&#xff1a; import java.io.BufferedInputStream…...

未来郴州:科技与自然的交响诗篇

故事背景 故事发生在中国湖南郴州&#xff0c;描绘了未来城市中科技与自然共生共荣的奇妙图景。通过六个充满诗意的场景&#xff0c;展现雾能转化系统、立体生态书库、智能稻田等创新设计&#xff0c;编织出一曲人类智慧与自然韵律共鸣的未来交响。 故事内容 在东江湖的晨雾中&…...

UE5 运行时动态将玩家手部模型设置为相机的子物体

在编辑器里&#xff0c;我们虽然可以手动添加相机&#xff0c;但是无法将网格体设置为相机的子物体&#xff0c;只能将相机设置为网格体的子物体 但是为了使用方便&#xff0c;我们希望将网格体设置为相机的子物体&#xff0c;这样我们直接旋转相机就可以旋转网格体&#xff0…...

Ubuntu系统下的包管理器APT

Ubuntu系统下的包管理器APT 在Linux操作系统生态中&#xff0c;软件包管理工具是连接用户与系统功能的桥梁。Ubuntu作为基于Debian的流行发行版&#xff0c;其强大的包管理系统APT&#xff08;Advanced Packaging Tool&#xff09;为开发者与系统管理员提供了便捷的软件生命周…...

超级码科技发布镂空AI保险胶带,重塑包装防伪新标准

在酒类、物流、奢侈品、电子产品等领域&#xff0c;包装安全与防伪需求日益迫切。传统封箱胶带易被转移或重复利用&#xff0c;导致商品被仿冒的风险居高不下。 为此&#xff0c;超级码科技推出镂空型防揭AI数字身份保险封箱胶带——一款集结构防伪、信息追踪与增值服务于一体的…...

微软Exchange管理中心全球范围宕机

微软已确认Exchange管理中心&#xff08;Exchange Admin Center&#xff0c;EAC&#xff09;发生全球性服务中断&#xff0c;导致管理员无法访问关键管理工具。该故障被标记为关键服务事件&#xff08;编号EX1051697&#xff09;&#xff0c;对依赖Exchange Online的企业造成广…...