SQL 多表查询:数据整合与分析的强大工具
SQL 多表查询:数据整合与分析的强大工具
在关系型数据库中,数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而,在实际应用中,往往需要对多个表中的数据进行整合查询,来获得更完整的信息。这时候,多表查询(Join)就显得至关重要。本文将详细介绍 SQL 中常见的多表查询类型,并通过实际示例帮助大家理解如何高效地利用这些查询方法。
一、 多表查询概述
多表查询 是指从多个表中获取数据并将其结合在一起的查询。数据库中的表通常是通过某些共享字段(如主键和外键)关联的,进行多表查询时,我们通过这些关系将不同表的数据合并为一个结果集。多表查询在数据分析和报告中非常常见,能够帮助我们在复杂的数据库结构中提取出有意义的、综合性的数据。
1.1 为什么需要多表查询
多表查询的需求通常来源于以下几个方面:
- 数据分布:在实际的数据库设计中,为了减少冗余、提高数据的组织性,往往将数据分散存储在不同的表中。例如,用户信息和订单信息一般存储在不同的表中,因此需要通过多表查询来关联这些表中的数据。
- 数据分析:多表查询可以帮助我们跨表分析数据。例如,在用户表和订单表之间进行连接,能够帮助我们分析每个用户的订单情况,甚至统计用户的消费金额。
- 简化复杂操作:多表查询能将复杂的操作简化,避免对每个表单独查询并手动组合数据。
1.2 多表查询的基本原理
在 SQL 中,进行多表查询时,常用的方式是使用 JOIN 操作符。通过 JOIN
,我们可以指定不同表之间的连接条件,进而获得跨多个表的联合数据。多表查询的基本原理就是将一个表中的数据与另一个表中的数据按照某种条件进行匹配。
二、 多表查询关系
在关系型数据库中,数据通常存储在多个表中。每个表都有自己的数据字段和记录,这些表之间可能存在某种关系。理解表之间的关系对于设计和执行多表查询至关重要。常见的多表查询关系有以下几种:
2.1 一对一关系(One-to-One)
描述:在一对一关系中,一个表的每条记录只能与另一个表的单条记录关联。这种关系通常用于将表中的数据拆分到不同的表中,以提高数据的管理效率或对隐私数据的隔离。
示例:
假设有两个表:users
(用户信息表)和 user_profiles
(用户详细资料表),每个用户只对应一条详细资料。
SELECT users.name, user_profiles.profile_picture
FROM users
INNER JOIN user_profiles ON users.id = user_profiles.user_id;
在此示例中,users
表和 user_profiles
表通过 id
和 user_id
进行连接,并且每个用户只能拥有一条详细资料。
2.2 一对多关系(One-to-Many)
描述:在一对多关系中,一个表中的一条记录可以与另一个表中的多条记录相关联。这是最常见的表之间的关系类型,例如,一个用户可以有多个订单,或者一个产品可以有多个评论。
示例:
假设有两个表:users
(用户信息表)和 orders
(订单表),每个用户可以拥有多个订单。
SELECT users.name, orders.order_id, orders.order_date
FROM users
INNER JOIN orders ON users.id = orders.user_id;
在这个例子中,users
表中的一条记录可能与 orders
表中的多条记录关联。
2.3 多对多关系(Many-to-Many)
描述:在多对多关系中,一个表中的多条记录可以与另一个表中的多条记录关联。这种关系通常通过第三方表来实现,该表包含两个表之间的外键。
示例:
假设有三个表:students
(学生表)、courses
(课程表)和 enrollments
(注册表)。每个学生可以注册多门课程,而每门课程也可以有多个学生。
SELECT students.name, courses.course_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
在这个例子中,students
表和 courses
表之间没有直接的关系,而是通过 enrollments
表来建立连接。每个学生可以注册多门课程,每门课程也可以有多个学生。
三、 多表查询分类
多表查询可以根据查询的方式分为两类:
3.1 连接查询(JOIN)
连接查询是通过将两个或多个表中的数据连接在一起,来获取相关的信息。连接查询可以分为两种主要类型:
- 内连接(INNER JOIN):返回符合条件的两个表中交集部分的数据。即只返回那些在两个表中都存在匹配项的记录。
- 外连接(OUTER JOIN):返回两个表的所有数据,并且包括左表和右表中没有匹配项的记录,右表或左表中的没有匹配项的列会显示为
NULL
。外连接又可以细分为以下几种:- 左外连接(LEFT OUTER JOIN):查询左表(第一个表)所有数据,以及两个表中交集部分的数据。右表中没有匹配项的记录会显示为
NULL
。 - 右外连接(RIGHT OUTER JOIN):查询右表(第二个表)所有数据,以及两个表中交集部分的数据。左表中没有匹配项的记录会显示为
NULL
。
- 左外连接(LEFT OUTER JOIN):查询左表(第一个表)所有数据,以及两个表中交集部分的数据。右表中没有匹配项的记录会显示为
- 自连接(SELF JOIN):当查询表自身时,通常使用自连接。自连接需要给表起一个别名,确保连接时能够区分表的不同实例。
3.2 子查询
子查询 是指在查询语句中嵌套另一个查询语句。子查询可以用来进一步过滤或处理数据,通常嵌套在 WHERE
或 FROM
子句中。
3.3 连接查询与子查询的比较
- 连接查询:通过使用
JOIN
关键字,可以非常高效地将多个表的数据合并为一条记录,尤其适用于表之间有关系时。 - 子查询:子查询适用于那些不能直接通过连接查询获取的数据,或者在某些场合下可以有效简化查询逻辑。
四、详细介绍
4.1 内连接的查询语法
在数据库查询中,内连接(Inner Join)是一种常见的操作,它用于将两张或多张表中的相关数据通过某些字段(通常是相等关系)进行匹配和连接。在 SQL 查询中,内连接有两种常见的写法:隐式内连接和显式内连接。这两种写法各有其适用场景,今天我们将详细介绍这两种语法,并解析它们的区别。
1. 隐式内连接(Implicit Join)
隐式内连接较为简洁,使用 WHERE
子句来指定连接条件。这种方式通过在 FROM
子句中列出多个表,并通过 WHERE
子句来定义匹配条件。虽然这种方式比较简洁,但在复杂查询中会使代码变得不够清晰,尤其是涉及多个连接条件时。
隐式内连接的语法:
SELECT 字段列表 FROM 表1, 表2 WHERE 条件;
在这个语法中,表1
和 表2
是需要连接的表,而 条件
则是连接的依据,通常是通过某个字段的相等关系来匹配记录。
示例: 假设我们有两张表:Customers
(客户表)和 Orders
(订单表),我们需要获取客户的姓名和他们购买的商品,连接条件是 CustomerID
。
SELECT Customers.Name, Orders.Product
FROM Customers, Orders
WHERE Customers.CustomerID = Orders.CustomerID;
解释:
Customers
表和Orders
表通过CustomerID
字段进行连接。WHERE
子句指定了连接条件:Customers.CustomerID = Orders.CustomerID
。- 只有在两个表中都存在匹配的
CustomerID
,该客户及其订单信息才会出现在查询结果中。
2. 显式内连接(Explicit Join)
显式内连接通过 INNER JOIN
和 ON
子句明确指定连接条件。相比隐式连接,显式连接更为清晰,尤其在多个表之间需要进行连接时,它能够清楚地表明各个表之间的关系。
显式内连接的语法:
SELECT 字段列表
FROM 表1
INNER JOIN 表2
ON 表1.字段 = 表2.字段;
在这种语法中,INNER JOIN
关键字表示连接方式是内连接,ON
子句指定了连接条件,即两个表中用于匹配的字段。
示例: 我们依旧使用 Customers
和 Orders
表,获取客户和他们购买的商品信息:
SELECT Customers.Name, Orders.Product
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
解释:
INNER JOIN
关键字指定了连接方式是内连接。ON
子句指定了连接条件:Customers.CustomerID = Orders.CustomerID
,即CustomerID
字段相等时,返回匹配的记录。- 只有当
Customers
表和Orders
表中都有对应的CustomerID
时,才会返回结果。
3. 隐式内连接与显式内连接的区别
- 清晰度: 显式内连接通过
INNER JOIN
和ON
子句明确指出了连接条件,通常比隐式内连接更容易理解和维护。尤其在连接多个表时,显式连接的可读性和逻辑性更强。 - 简洁性: 隐式内连接语法较为简洁,适用于简单的查询。不过,在涉及多个连接或复杂查询时,隐式连接可能会导致代码不够直观。
- 维护性: 显式内连接由于结构清晰,更容易进行修改和调试。在编写复杂的 SQL 查询时,推荐使用显式内连接。
4.2 外连接的查询语法
外连接(Outer Join)是一种 SQL 查询中常用的连接操作,它与内连接(Inner Join)的不同之处在于:外连接不仅返回两个表中匹配的记录,还会返回某一表中没有匹配的记录,并将其与另一个表的空值(NULL)一起展示。外连接主要有三种类型:左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。在本节中,我们将重点介绍左外连接和右外连接的语法,并解析它们的区别。
1. 左外连接(Left Outer Join)
左外连接返回左表(即查询中的第一个表)中的所有记录,即使在右表中没有匹配的记录。对于右表中没有匹配的记录,查询结果中的相关字段会返回 NULL
值。
左外连接的语法:
SELECT 字段列表
FROM 表1
LEFT [OUTER] JOIN 表2
ON 表1.字段 = 表2.字段;
在这个语法中,LEFT JOIN
或 LEFT OUTER JOIN
都表示左外连接,ON
子句指定了连接条件。
示例: 假设我们有两张表:Customers
和 Orders
,我们需要查询所有客户的姓名和他们的订单,如果某个客户没有订单,则返回 NULL
作为订单信息。
SELECT Customers.Name, Orders.Product
FROM Customers
LEFT OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
解释:
- 这个查询将返回所有客户的信息,包括那些没有订单的客户。对于没有订单的客户,查询结果中的
Product
字段将显示为NULL
。
2. 右外连接(Right Outer Join)
右外连接与左外连接类似,只不过它返回的是右表(即查询中的第二个表)中的所有记录,即使左表中没有匹配的记录。对于左表中没有匹配的记录,查询结果中的相关字段会返回 NULL
值。
右外连接的语法:
SELECT 字段列表
FROM 表1
RIGHT [OUTER] JOIN 表2
ON 表1.字段 = 表2.字段;
在这个语法中,RIGHT JOIN
或 RIGHT OUTER JOIN
表示右外连接,ON
子句指定了连接条件。
示例: 假设我们依旧使用 Customers
和 Orders
表,我们希望查询所有订单的信息,包括那些没有客户信息的订单。若某个订单没有客户对应,则返回 NULL
作为客户姓名。
SELECT Customers.Name, Orders.Product
FROM Customers
RIGHT OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
解释:
- 这个查询将返回所有订单的信息,包括那些没有客户信息的订单。对于没有客户的订单,查询结果中的
Name
字段将显示为NULL
。
3. 左外连接与右外连接的区别
- 左外连接 返回左表的所有记录,包括那些没有右表匹配的记录,右表的字段会显示为
NULL
。 - 右外连接 返回右表的所有记录,包括那些没有左表匹配的记录,左表的字段会显示为
NULL
。 - 这两者的主要区别在于返回的记录来源。左外连接侧重于左表的完整性,右外连接则侧重于右表的完整性。
4.3 自连接的查询语法
自连接(Self Join)是一种特殊的连接操作,它将同一张表与自己进行连接。通常,表在查询中被引用两次,一个用于作为左表,另一个作为右表。在 SQL 中执行自连接时,必须使用别名(Alias)来区分同一张表的不同实例。自连接可以是内连接(Inner Join)也可以是外连接(Outer Join),具体取决于你需要的查询结果。
自连接的语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 别名A.字段 = 别名B.字段;
在这个语法中:
表A
是需要进行自连接的表,别名A
和别名B
用于区分表的两个不同实例。JOIN
可以是内连接(INNER JOIN
)或外连接(LEFT OUTER JOIN
,RIGHT OUTER JOIN
),具体取决于查询的需求。ON
子句指定了连接条件,即两个表实例之间如何匹配字段。
示例:
假设我们有一张 Employees
(员工表)表,包含 EmployeeID
(员工ID)和 ManagerID
(经理ID),我们希望查询每位员工及其经理的姓名。此时,Employees
表既是查询的左表也是右表,因此我们需要使用自连接。
SELECT E1.EmployeeName AS Employee, E2.EmployeeName AS Manager
FROM Employees E1
INNER JOIN Employees E2
ON E1.ManagerID = E2.EmployeeID;
解释:
E1
和E2
是Employees
表的两个别名,E1
代表员工,E2
代表经理。- 通过
INNER JOIN
将E1.ManagerID
和E2.EmployeeID
进行匹配,从而将员工与他们的经理进行关联。
自连接的应用场景
自连接通常用于以下场景:
- 层级结构查询: 比如在包含员工和经理的表中,通过自连接查找每个员工的经理。
- 关联数据: 如果一个表中的记录需要与同一表中的其他记录进行比较或匹配,自连接是一种常用的方法。
4.3.1 自连接与内连接的关系
自连接本质上是内连接的一种特殊形式,只不过它是将表与自身进行连接。因此,自连接可以使用内连接或者外连接,具体取决于数据的匹配要求。
当然可以,延续之前章节风格,下面是 联合查询(Union) 的内容整理:
4.4 联合查询(Union)的查询语法
联合查询(UNION
)用于将多个 SELECT
查询的结果合并为一个总的结果集合。它通常用于从结构相同(列数和类型一致)的多个表中获取数据,并将这些结果整合展示。
1. UNION 和 UNION ALL 的区别
UNION
:自动去重,返回的结果集中不包含重复的行。UNION ALL
:不去重,保留所有结果,包括重复行,效率通常更高。
2. 联合查询的基本语法:
SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B;
注意:两个
SELECT
查询的 字段数量、字段顺序和数据类型 必须保持一致。
UNION ALL
会将全部的数据直接合并在一起,UNION
会对合并之后的数据去重。
3. 示例
假设我们有两个表:DomesticOrders
(国内订单)和 InternationalOrders
(国际订单),我们希望获取所有订单的编号和客户姓名:
SELECT OrderID, CustomerName FROM DomesticOrders
UNION
SELECT OrderID, CustomerName FROM InternationalOrders;
- 使用
UNION
,重复的订单编号将只显示一次。
如果我们希望显示所有订单(包括重复记录):
SELECT OrderID, CustomerName FROM DomesticOrders
UNION ALL
SELECT OrderID, CustomerName FROM InternationalOrders;
4.5 子查询的查询语法
子查询(Subquery),又称为嵌套查询(Nested Query),是指将一个 SELECT
查询语句嵌套在另一个 SQL 语句内部的查询方式。它通常用于在主查询(外部查询)中提供中间结果,供其进行进一步过滤或判断。
例如:
SELECT * FROM t1
WHERE column1 = (SELECT column1 FROM t2
);
子查询可以出现在 SELECT
、FROM
、WHERE
、HAVING
等位置,并且外部语句不限于 SELECT
,也可以是 INSERT
、UPDATE
、DELETE
等。
类型 | 返回结果 | 常见关键词 |
---|---|---|
标量子查询 | 单行单列 | = , > , < 等 |
列子查询 | 多行一列 | IN , ANY , ALL |
行子查询 | 一行多列 | = , IN |
表子查询 | 多行多列(临时表) | 作为 FROM 的子表 |
1. 子查询的分类(按返回结果类型)
根据子查询返回结果的不同,可将其分为以下几种类型:
① 标量子查询(Scalar Subquery)
- 返回单个值(单行单列)。
- 常用于
WHERE
、SELECT
、SET
等语句中。
SELECT Name, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees
);
② 列子查询(Column Subquery)
- 返回单列多行。
- 通常结合
IN
、ANY
、ALL
等关键字使用。
SELECT Name
FROM Employees
WHERE DepartmentID IN (SELECT ID FROM Departments WHERE Location = 'Beijing'
);
③ 行子查询(Row Subquery)
- 返回单行多列。
- 通常与
=
,<
,>
,IN
等配合使用。
SELECT *
FROM Products
WHERE (CategoryID, SupplierID) = (SELECT CategoryID, SupplierID FROM Products WHERE ProductID = 10
);
④ 表子查询(Table Subquery)
- 返回多行多列,类似于一张临时表。
- 常用在
FROM
子句中,作为派生表(Derived Table)。
SELECT DeptName, AvgSalary
FROM (SELECT DepartmentID, AVG(Salary) AS AvgSalaryFROM EmployeesGROUP BY DepartmentID
) AS SubDept
JOIN Departments ON SubDept.DepartmentID = Departments.ID;
2. 子查询的使用位置
位置 | 说明 |
---|---|
WHERE 子句 | 用于作为条件过滤 |
FROM 子句 | 用作虚拟表,供外层查询使用 |
SELECT 子句 | 直接嵌入字段计算中 |
HAVING 子句 | 聚合后再进行子查询过滤 |
3. 子查询注意事项
- 子查询返回值数量要与外部语句逻辑匹配:
- 标量子查询只能返回一行一列。
- 多行结果需使用
IN
、EXISTS
等。
- 子查询性能可能较低,复杂嵌套应考虑改为
JOIN
。 - 子查询可以嵌套多层,但为保证可读性不建议超过两层。
五、总结
SQL 的多表查询是数据分析和数据库管理中非常强大的工具。通过多表查询,我们能够轻松地跨多个表整合数据,从而获取更丰富的信息。无论是通过 JOIN 操作将表连接起来,还是使用 子查询 进行数据处理,SQL 提供的这些功能使得我们可以灵活地应对复杂的数据库结构和查询需求。
在本篇博客中,我们深入探讨了多表查询的几种常见关系类型(如一对一、一对多和多对多关系),并详细介绍了不同类型的 JOIN 查询(如内连接、外连接、左外连接和右外连接)。每种连接方式都有其特定的使用场景和优缺点。我们还对 子查询 和 自连接 进行了讨论,强调了它们在实际应用中的重要性和有效性。
SQL 多表查询不仅仅是数据提取的工具,它还极大地简化了复杂的数据分析过程,减少了冗余操作。掌握这些查询技巧,不仅能帮助你更高效地操作数据库,也能在数据分析过程中提供更多的洞察力。
无论你是数据库开发者、数据分析师,还是 SQL 新手,理解并熟练运用 SQL 多表查询都将大大提升你的工作效率和数据处理能力。希望通过本篇文章,你能够更深入地理解多表查询的各种方式,并在实际应用中充分利用这些强大的工具。
相关文章:
SQL 多表查询:数据整合与分析的强大工具
SQL 多表查询:数据整合与分析的强大工具 在关系型数据库中,数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而,在实际应用中,往往需要对多个表中的数据进行整合查询,来获得更完整的信…...
MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX
名词解释: ADC: Analog-to-Digital SAR:Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践:单通道采集芯片内部温度传感器(ADC1_ch16)&a…...
MacOS中安装Python(homebrew,pyenv)
前言 由于MacOS中自带Python,而自带的Python关联到许多系统组件,不推荐 禁止使用自带Python 安装homebrew包管理器 homebrew官网 打开终端(terminal)输入以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercon…...
从物理到预测:数据驱动的深度学习的结构化探索及AI推理
在当今科学探索的时代,理解的前沿不再仅仅存在于我们书写的方程式中,也存在于我们收集的数据和构建的模型中。在物理学和机器学习的交汇处,一个快速发展的领域正在兴起,它不仅观察宇宙,更是在学习宇宙。 AI推理 我们…...
新书速览|Hadoop与Spark大数据全景解析(视频教学版)
《Hadoop与Spark大数据全景解析:视频教学版》 01 本书内容 《Hadoop与Spark大数据全景解析:视频教学版》结合作者多年在大数据领域的开发实践经验,采用“理论实战”的形式,以大量实例全面介绍Hadoop和Spark的基础知识及其高级应用。作者将丰富的教学经…...
Linux:42线程控制lesson30
代码1:验证join可以去的线程执行完后的退出码/返回值 #include<iostream> #include<unistd.h> #include<pthread.h> #include<string> using namespace std;void* routine(void* arg){string name static_cast<const char*>(arg);i…...
配置 Apache 的 HTTPS
证书文件 文件名 作用 来源 example.com.key 服务器的私钥,用于加密和解密数据。 本地生成 -----BEGIN PRIVATE KEY----- MIIEowIBAAKCAQEAqp5c... -----END PRIVATE KEY----- example.com.csr Certificate Signing Request 证书签名请求文件,包…...
【Flutter高效开发】GetX指南:一文学会状态管理、路由与依赖注入
GetX是Flutter生态中最受欢迎的轻量级全能框架,以其简洁的API设计和卓越的性能著称。本文将带你全面掌握GetX的核心功能和使用技巧,提升你的Flutter开发效率。 一、GetX框架核心优势 1. 三位一体架构设计 模块功能传统方案对比状态管理响应式状态控制…...
第四节:核心概念高频题-Vue生命周期钩子变化
重命名:beforeDestroy→beforeUnmount,destroyed→unmounted 新增:onServerPrefetch(SSR场景) Vue 生命周期钩子变化详解(Vue2 → Vue3) 一、核心钩子重命名与语义优化 销毁阶段语义化升级 • …...
安全邮件系统的Maple实现详解
代码改进版: # # 安全邮件系统实现 - 结合DES和RSA加密 # 功能:实现安全的消息加密、签名和传输 # # -------------------------- # 第一部分:消息准备和加密 # --------------------------# 原始消息内容 message : "This is an atte…...
VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)
参考: 安装VTK 详细图文讲解CMake编译VTK,包含详细的编译环境版本 Visual Studio 2022 配置VTK9.3.0 VTK-8.2.0源码编译和初步使用(CmakeVS2015Qt5.14.2) 文章目录 下载编译编译环境介绍配置CMake信息BUILD_SHARED_LIBS控制生成的库是动态链接库…...
【playwright】学习--持续汇总
seleniumplaywrightselenium 需要结合其他自动化框架,比如pytest之后才能支持web自动化测试playwright 不需要其他自动化框架selenium库》webdriver》浏览器驱动playwright库》playwright driver》浏览器驱动 目录 安装playwright通过pip安装通过VScode安装 安装pla…...
深度解析算法之模拟
39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 ? 字符的字符串 s,请你将所有的 ? 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。 注意:你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#…...
leetcode刷题日记——插入区间
[ 题目描述 ]: [ 思路 ]: intervals 有序,需要将一个新的范围插入,然后进行整合方法一,将新的范围插入原 intervals 区间,然后使用 56 题的合并区间函数直接解决方法二, 找出能够包容 newInte…...
gbase8s存储学习一 rootdbs存储结构以及寻址分析
主要层次自下而上为 最小物理存储单元page ,多个page 组成逻辑存储单元extent,多个extent 组成物理存储单元chunk ,而多个chunk组成逻辑存储单元dbspace,多个dbspace 组成一个数据库实例 在数据库初始化阶段会生成一个rootdbs表空间,该表空…...
学习设计模式《五》——工厂方法模式
一、基础概念 工厂方法模式的本质是【延迟到子类来选择实现】; 工厂方法模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到其子类 。 工厂方法模式的功能 序号说明0工厂方法模…...
如何将 Azure Active Directory (Azure AD) 作为 SAML IdP 对接到 Keycloak
✅ 一、在 Azure AD 创建 SAML 应用 🔧 1. 登录 Azure 门户 前往 https://portal.azure.com,使用管理员账号登录。 📌 2. 创建企业应用(Enterprise Application) 左侧菜单进入 “企业应用程序”。点击 “新建应用程…...
OCR之身份证识别
前言 OCR身份证识别是光学字符识别技术在身份证领域的应用。通过扫描或拍照获取身份证图像,利用图像处理、深度学习等技术,自动提取姓名、性别、民族、出生日期、地址、身份证号等信息,可大幅提升信息录入效率,广泛应用于政务、金…...
JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践
在现代网络应用中,动态网页内容的爬取一直是开发者面临的挑战之一。Puppeteer 作为一种强大的浏览器自动化工具,为这一问题提供了优雅的解决方案。本文将深入探讨 Puppeteer 的高级技巧,包括动态内容抓取、性能优化、反检测与伪装、复杂自动化…...
组织级项目管理OPM
组织级项目管理(Organizational Project Management, OPM)是一种系统化的管理方法,旨在通过整合项目组合、项目集和项目管理,确保组织的战略目标与项目执行的一致性,提升资源利用效率和项目成功率。以下是其核心内容与框架的详述: 一、组织级项目管理的定义与目标 定义 组…...
HTML与Web 性能优化:构建高速响应的现代网站
HTML 与 Web 性能优化:构建高速响应的现代网站 引言 随着互联网用户对网站加载速度期望的不断提高,前端性能优化已经成为现代 Web 开发的核心竞争力。据 Google 研究表明,页面加载时间每增加 1 秒,用户跳出率就会增加 32%。用户…...
模型 观测者效应
系列文章分享模型,了解更多👉 模型_思维模型目录。观察即影响,存在因注视而变。 1 观测者效应的应用 1.1 工业心理学—霍桑实验中的生产效率谜题 行业背景:20世纪20年代西方电气公司霍桑工厂,研究者试图通过优化照明…...
Ubuntu启动SMB(Samba)服务步骤
目录 1.基本的Samba服务器搭建流程主要分为四个步骤。 2.Samba工作流程: 3.解读主要配置文件smb.conf 4.开始安装Samba 5.检查Samba服务状态 6.创建Samba共享文件夹 7.配置Samba文件以及设置Samba用户密码 8.重启Samba服务器 9.关闭防火墙 10.Linux客户端…...
使用react的ant-design-pro框架写一个地图组件,可以搜索地图,可以点击地图获取点击的位置及经纬度
首先,先创建一个地图页面,用于显示地图组件,我是在pages文件中创建了一个mapSearch组件。 然后在routes.ts中注册页面。 {path: /mapSearch,name: mapSearch,icon: smile,component: ./mapSearch,}, 第三步就是使用高德地图来创建地图。 关键…...
【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题
文章目录 昨日内容复习已经建立了 TCP 连接,客户端突然出现故障怎么办?什么时候用长连接?短连接?TCP 的半连接队列与全连接队列?什么是 SYN 攻击?如何避免?TIME_WAIT 的作用?过多如何…...
Git远程操作与标签管理
目录 1.理解分布式版本控制系统 2.远程仓库 3.新建远程仓库 4.克隆远程仓库 5.向远程仓库推送 6.拉取远程仓库 7.配置Git 7.1.忽略特殊文件 7.2.给命令配置别名 8.标签管理 8.1.理解标签 8.2.创建标签 8.3.操作标签 1.理解分布式版本控制系统 Git是目前世界上…...
Element Plus消息通知体系深度解析:从基础到企业级实践
一、核心组件与技术定位 Element Plus的消息通知体系由三个核心组件构成:ElMessage(全局提示)、ElNotification(通知弹窗)和ElMessageBox(交互式对话框)。这套体系的设计目标是为开发者提供轻量…...
SpringCloud组件——Eureka
一.背景 1.问题提出 我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...
[Godot] C#2D平台游戏基础移动和进阶跳跃代码
本文章给大家分享一下如何实现基本的移动和进阶的跳跃(跳跃缓冲、可变跳跃、土狼时间)以及相对应的重力代码,大家可以根据自己的需要自行修改 实现效果 场景搭建 因为Godot不像Unity,一个节点只能绑定一个脚本,所以我…...
C语言对n进制的处理
先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换? 简单来说,进制就是数位的表示方法。 十进制(常用&am…...
rk3568main.cc解析
rk3568main.cc解析 前言解析总结前言 正点原子rk3568学习,rk官方RKNN_MODEL_ZOO文件中 rknn_model_zoo-main/examples/mobilenet/cpp/main.cc 从执行命令:./build-linux.sh -t rk3568 -a aarch64 -d mobilenet 到: cmake ../../examples/mobilenet/cpp \-DTARGET_SOC=rk3…...
【白雪讲堂】[特殊字符]内容战略地图|GEO优化框架下的内容全景布局
📍内容战略地图|GEO优化框架下的内容全景布局 1️⃣ 顶层目标:GEO优化战略 目标关键词: 被AI理解(AEO) 被AI优先推荐(GEO) 在关键场景中被AI复读引用 2️⃣ 三大引擎逻辑&#x…...
S32K144学习(16)-Bootloader
1.什么是bootloader Bootloader(引导加载程序) 是存储在设备非易失性存储器(如 ROM、Flash)中的一段特殊程序,负责在设备上电后初始化硬件、加载操作系统(OS)或用户应用程序,并最终…...
反素数c++
先上代码 #include<bits/stdc.h> using namespace std; typedef long long ll; ll n; ll p[]{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; int maxd,maxval; void dfs(int pl,ll tmp,int num,int up){ if((num>maxd)||(nummaxd&&maxval>tmp)){ …...
C++ linux打包运行方案(cmake)
文章目录 背景动态库打包方案动态库转静态库动态库打到软件包中 运行 背景 使用C编写的一个小项目,需要打包成ubuntu下的可执行文件,方便分发给其他ubuntu执行,因为docker镜像方案过于臃肿,所以需要把项目的动态库都打在软件包中…...
JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧
进一步探讨如何使用 Puppeteer 进行动态网页爬取,特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时,确保页面元素完全加载是获取完整数据的关键。Puppeteer…...
AI数字人:元宇宙舞台上的闪耀新星(7/10)
摘要:AI数字人作为元宇宙核心角色,提升交互体验,推动内容生产变革,助力产业数字化转型。其应用场景涵盖虚拟社交、智能客服、教育、商业营销等,面临技术瓶颈与行业规范缺失等挑战,未来有望突破技术限制&…...
测试基础笔记第九天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、数据类型和约束1.数据类型2.约束3.主键4.不为空5.唯一6.默认值 二、数据库操作1.创建数据库2.使用数据库3.修改数据库4.删除数据库和查看所有数据库5.重点&…...
C++抽象基类定义与使用
在 C 中,抽象基类(Abstract Base Class, ABC) 是一种特殊的类,用于定义接口规范和约束派生类的行为。它通过纯虚函数(Pure Virtual Function)强制要求派生类实现特定功能,自身不能被实例化。以下…...
20.4 显示数据库数据
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.4.1 设计时进行简单绑定 【例 20.22】【项目:code20-022】设计时关联数据库。 设计时设置DataGridView的DataSource属…...
PyTorch 多 GPU 入门:深入解析 nn.DataParallel 的工作原理与局限
当你发现单个 GPU 已经无法满足你训练庞大模型或处理海量数据的需求时,利用多 GPU 进行并行训练就成了自然的选择。PyTorch 提供了几种实现方式,其中 torch.nn.DataParallel (简称 DP) 因其使用的便捷性,常常是初学者接触多 GPU 训练的第一站…...
UDP协议理解
文章目录 UDP协议理解UDP 协议的特点:UDP协议图示UDP 的头部结构:UDP数据传输图示 UDP 的应用场景:TCP 与UDP对比UDP的传输丢包和顺序错乱问题(了解)丢包的解决方法:顺序错乱的解决方法:综合应用…...
微信小程序拖拽排序有效果图
效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…...
算力网络的早期有关论文——自用笔记
2023年底至2024年初阅读有关论文的自用笔记,作为参考。 算力网络架构 https://baijiahao.baidu.com/s?id1727377583404975414&wfrspider&forpc think¬e 是否可以和cpu进程调度联系。 目前:看一些综述深一步了解背景和发展现状,完善认…...
卷积神经网络基础(四)
今天我们继续学习各个激活函数层的实现过程。 目录 5.2 Sigmoid层 六、Affine/Softmax层实现 6.1 Affine层 6.2 批处理版本 5.2 Sigmoid层 sigmoid函数的表达式如下: 用计算图表示的话如下: 计算过程稍微有些复杂,且这里除了乘法和加法…...
【MySQL数据库】表的约束
目录 1,空属性 2,默认值 3,列描述 4,zerofill 5,主键primary key 6,自增长auto_increment 7,唯一键unique 8,外键foreign key 在MySQL中,表的约束是指用于插入的…...
网络威胁情报 | Friday Overtime Trooper
本文将分别从两个环境出发,以实践来体验利用威胁情报分析可疑文件的过程。 Friday Overtime 现在你是一位安全分析人员,正在美美等待周五过去,但就在即将下班之时意外发生了:你的客户发来求助,说他们发现了一些可疑文…...
GPIO(通用输入输出端口)详细介绍
一、基本概念 GPIO(General - Purpose Input/Output)即通用输入输出端口,是微控制器(如 STM32 系列)中非常重要的一个外设。它是一种软件可编程的引脚,用户能够通过编程来控制这些引脚的输入或输出状态。在…...
学习笔记——《Java面向对象程序设计》-继承
参考教材: Java面向对象程序设计(第3版)微课视频版 清华大学出版社 1、定义子类 class 子类名 extends 父类名{...... }如: class Student extends People{...... } (1)如果一个类的声明中没有extends关…...
基于javaweb的SpringBoot校园失物招领系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...