MySQL—多表操作详解

在 MySQL 中,多表操作通常涉及联接(JOIN)和子查询(Subquery),用于处理来自多个表的数据。

约束分类

约束介绍

约束:用于对数据库表中的数据进行限定,确保数据的正确性、有效性和完整性。

约束的分类

约束说明
PRIMARY KEY主键约束,唯一标识每行数据
PRIMARY KEY AUTO_INCREMENT主键自增,自动为新数据生成唯一标识符
UNIQUE唯一约束,保证字段值在表中唯一
NOT NULL非空约束,确保字段不能为空
FOREIGN KEY外键约束,确保引用其他表中的主键
FOREIGN KEY ON UPDATE CASCADE外键级联更新,引用的主键更新时自动更新
FOREIGN KEY ON DELETE CASCADE外键级联删除,引用的主键删除时自动删除

主键约束

主键约束用于唯一标识表中的每一行数据,并自动包含非空和唯一两个特性。

主键约束特点:

  • 主键列中的数据必须唯一,且不能包含空值。
  • 一张表只能有一个主键。
  • 主键通常用于标识表中的每一条记录。

建表时添加主键约束

CREATE TABLE 表名 (列名 数据类型 PRIMARY KEY,列名 数据类型,...
);

删除主键约束

ALTER TABLE 表名 DROP PRIMARY KEY;

建表后单独添加主键约束

ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;

主键自增

主键自增约束在插入数据时,主键列的值会自动增加,通常用于数值型主键。

主键自增的特点:

  • 主键自增列可以为空,但插入新数据时会自动分配一个唯一的值。
  • 删除记录不会影响自增序列,下一条记录仍然基于先前的最大值递增。

建表时添加主键自增约束

CREATE TABLE 表名 (列名 数据类型 PRIMARY KEY AUTO_INCREMENT,列名 数据类型,...
);

删除主键自增约束

ALTER TABLE 表名 MODIFY 列名 数据类型;

建表后单独添加主键自增约束

ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;

唯一约束

唯一约束确保某列中的数据不会重复。

建表时添加唯一约束

CREATE TABLE 表名 (列名 数据类型 UNIQUE,列名 数据类型,...
);

删除唯一约束

ALTER TABLE 表名 DROP INDEX 列名;

建表后单独添加唯一约束

ALTER TABLE 表名 MODIFY 列名 数据类型 UNIQUE;

非空约束

非空约束确保字段不能为空。

建表时添加非空约束

CREATE TABLE 表名 (列名 数据类型 NOT NULL,列名 数据类型,...
);

删除非空约束

ALTER TABLE 表名 MODIFY 列名 数据类型;

建表后单独添加非空约束

ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;

外键约束

外键约束用于定义表与表之间的关系,确保数据的完整性和一致性。

建表时添加外键约束

CREATE TABLE 表名 (列名 数据类型 约束,...CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
);

删除外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

建表后单独添加外键约束

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名);

外键级联操作

级联操作用于定义当主表中的数据发生变化时从表中数据的响应方式。

  • RESTRICT 和 NO ACTION:如果从表有相关记录,则禁止对主表进行删除或更新操作。
  • CASCADE:当主表中的数据更新或删除时,从表中对应的数据也将被更新或删除。
  • SET NULL:当主表中的数据更新或删除时,从表中的对应字段会被设置为 NULL。

添加级联更新

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名) ON UPDATE [CASCADE | RESTRICT | SET NULL];

添加级联删除

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名) ON DELETE CASCADE;

同时添加级联更新和级联删除

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名) ON UPDATE CASCADE ON DELETE CASCADE;

多表设计

在数据库设计中,多表之间的关联关系通常分为三类:一对一、一对多、多对多。这些关系通过外键约束来实现,确保表与表之间数据的逻辑一致性。

一对一关系

一对一关系是指两个表中的每一行数据在另一个表中只有一条对应记录。常见的例子是人和身份证,每个人对应一个唯一的身份证。

实现原则:

在任意一个表中建立外键,用于关联另一张表的主键,确保两个表的一对一关系。

-- 人表
CREATE TABLE Person (PersonID INT PRIMARY KEY,Name VARCHAR(50)-- 其他字段
);-- 身份证表
CREATE TABLE IDCard (IDCardID INT PRIMARY KEY,PersonID INT,CardNumber VARCHAR(20),-- 建立与人表的外键关系,确保数据一致性FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
);

一对多关系

一对多关系是最常见的关系类型,指一个表中的一条记录可以对应另一个表中的多条记录。例如:用户和订单,一个用户可以有多个订单;商品分类和商品,一个分类下可以有多个商品。

实现原则:

在多的一方表中建立外键,关联到一的一方的主键。即多的一方通过外键约束和一的一方建立联系。

-- 用户表
CREATE TABLE User (UserID INT PRIMARY KEY, -- 用户ID,主键Name VARCHAR(50) -- 用户姓名-- 其他字段
);-- 订单表
CREATE TABLE Order (OrderID INT PRIMARY KEY, -- 订单ID,主键UserID INT, -- 用户ID,与用户表的UserID关联OrderDate DATE, -- 订单日期FOREIGN KEY (UserID) REFERENCES User(UserID) -- 外键约束,确保订单表中的UserID引用用户表中的UserID
);

多对多关系

多对多关系通常出现在两个表中都有多个关联记录的场景。例如:学生和课程,一个学生可以选修多门课程,而一门课程可以被多个学生选修。

实现原则:

通过中间表(也叫关联表)来实现。中间表至少包含两个外键,分别关联到两张主表的主键。

-- 学生表
-- 该表存储学生的相关信息
CREATE TABLE Student (StudentID INT PRIMARY KEY,  -- 学生ID,作为主键Name VARCHAR(50),           -- 学生姓名-- 其他字段
);-- 课程表
-- 该表存储课程的相关信息
CREATE TABLE Course (CourseID INT PRIMARY KEY,   -- 课程ID,作为主键CourseName VARCHAR(50),     -- 课程名称-- 其他字段
);-- 中间表:学生课程关系表
-- 该表用于关联学生与所选课程的关系
CREATE TABLE StudentCourse (StudentID INT,              -- 学生ID,外键关联到学生表CourseID INT,               -- 课程ID,外键关联到课程表PRIMARY KEY (StudentID, CourseID),  -- 联合主键,确保每条记录唯一FOREIGN KEY (StudentID) REFERENCES Student(StudentID),  -- 外键约束FOREIGN KEY (CourseID) REFERENCES Course(CourseID)      -- 外键约束
);

总结

  • 一对一:在任意一个表中建立外键,关联另一个表的主键。
  • 一对多:在多的一方建立外键,关联一的一方的主键。
  • 多对多:通过中间表来记录两张表之间的多对多关系,中间表包含两个外键,分别关联两张表的主键。

连接查询

连接查询是数据库中用于从多个表中获取数据的一种操作。通过连接查询,可以将多个表中的数据根据特定的条件组合在一起,从而获取更全面的信息。常见的连接类型包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。

内连接(INNER JOIN)

定义:连接查询的是两张表有交集的部分数据,两张表分为驱动表和被驱动表,如果结果集中的每条记录都是两个表相互匹配的组合,则称这样的结果集为笛卡尔积 。

显式内连接

显式内连接使用 INNER JOIN 关键字,明确指定连接条件。

语法:

SELECT 列名
FROM 表名1
[INNER] JOIN 表名2
ON 条件;

隐式内连接

隐式内连接使用 WHERE 子句来指定连接条件,而不是使用 INNER JOIN 关键字。在某些情况下,WHERE 子句和 ON 子句是等价的。

语法:

SELECT 列名
FROM 表名1, 表名2
WHERE 条件;

STRAIGHT_JOIN

STRAIGHT_JOIN 与 JOIN 类似,但它强制数据库引擎按照指定的顺序读取表。具体来说,左表始终在右表之前读取。STRAIGHT_JOIN 只适用于内连接。 

语法

SELECT 列名
FROM 表名1 STRAIGHT_JOIN 表名2
ON 条件;

总结

  • 显式内连接:使用 INNER JOIN 关键字,明确指定连接条件。
  • 隐式内连接:使用 WHERE 子句来指定连接条件,而不是使用 INNER JOIN 关键字。
  • STRAIGHT_JOIN:强制数据库引擎按照指定的顺序读取表,左表始终在右表之前读取,只适用于内连接。

左连接(LEFT JOIN)

定义:左连接返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则返回NULL。

语法

SELECT 列名
FROM 表1
LEFT JOIN 表2
ON 表1.列名 = 表2.列名;

右连接(RIGHT JOIN)

定义:右连接返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则返回NULL。

语法

SELECT 列名
FROM 表1
RIGHT JOIN 表2
ON 表1.列名 = 表2.列名;

全外连接(FULL OUTER JOIN)

定义:全外连接返回两个表中的所有行,无论是否满足连接条件。如果某个表中没有匹配的行,则返回NULL。

语法

SELECT 列名
FROM 表1
FULL OUTER JOIN 表2
ON 表1.列名 = 表2.列名;

示例数据库

为了更好地理解连接查询,假设我们有以下两个表:

-- 用户表
CREATE TABLE User (UserID INT PRIMARY KEY,Name VARCHAR(50)
);-- 订单表
CREATE TABLE `Order` (OrderID INT PRIMARY KEY,UserID INT,OrderDate DATE
);-- 插入数据
INSERT INTO User (UserID, Name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');INSERT INTO `Order` (OrderID, UserID, OrderDate) VALUES
(101, 1, '2023-01-01'),
(102, 1, '2023-02-01'),
(103, 2, '2023-03-01');

查询示例

内连接:

SELECT User.Name, `Order`.OrderDate
FROM User
INNER JOIN `Order`
ON User.UserID = `Order`.UserID;

左连接:

SELECT User.Name, `Order`.OrderDate
FROM User
LEFT JOIN `Order`
ON User.UserID = `Order`.UserID;

右连接:

SELECT User.Name, `Order`.OrderDate
FROM User
RIGHT JOIN `Order`
ON User.UserID = `Order`.UserID;

全外连接:

SELECT User.Name, `Order`.OrderDate
FROM User
FULL OUTER JOIN `Order`
ON User.UserID = `Order`.UserID;

关联查询

关联查询是指在查询中使用多个表的数据,通过某种条件将这些表的数据关联起来。关联查询可以分为多种类型,包括自关联查询。

自关联查询是指在同一张表中进行查询,表中的数据之间存在某种关联关系。自关联查询通常用于处理层次结构数据或需要多次查询同一张表的情况。

示例场景:假设有一个员工表 Employee,其中每个员工都有一个 ManagerID,指向另一个员工的 EmployeeID,表示该员工的直接上级。

表结构及插入数据

CREATE TABLE Employee (EmployeeID INT PRIMARY KEY,Name VARCHAR(50),ManagerID INT,FOREIGN KEY (ManagerID) REFERENCES Employee(EmployeeID)
);
INSERT INTO Employee (EmployeeID, Name, ManagerID) VALUES
(1, 'Alice', NULL),  -- Alice 是 CEO,没有上级
(2, 'Bob', 1),       -- Bob 的上级是 Alice
(3, 'Charlie', 1),   -- Charlie 的上级是 Alice
(4, 'David', 2),     -- David 的上级是 Bob
(5, 'Eve', 2);       -- Eve 的上级是 Bob

查询每个员工的直接上级:

SELECTe.Name AS EmployeeName,m.Name AS ManagerName
FROMEmployee e
LEFT JOINEmployee m
ONe.ManagerID = m.EmployeeID;

查询每个员工的直接下级:

SELECT m.Name AS ManagerName,e.Name AS EmployeeName
FROM Employee e
RIGHT JOIN Employee m
ON e.ManagerID = m.EmployeeID;

查询每个员工的完整层级路径:

-- 递归查询员工层级结构
WITH RECURSIVE EmployeeHierarchy AS (-- 初始化递归查询,选取经理层级以上的员工SELECTEmployeeID,Name,ManagerID,1 AS LevelFROMEmployeeWHEREManagerID IS NULLUNION ALL-- 递归部分,构建员工和其经理之间的层级关系SELECTe.EmployeeID,e.Name,e.ManagerID,eh.Level + 1FROMEmployee eINNER JOINEmployeeHierarchy ehONe.ManagerID = eh.EmployeeID
)
-- 最终查询,展示员工、其直接经理和层级信息
SELECTe.Name AS EmployeeName,eh.Name AS ManagerName,eh.Level
FROMEmployeeHierarchy eh
LEFT JOINEmployee e
ONeh.EmployeeID = e.EmployeeID
ORDER BYeh.Level, e.Name;

连接原理

在数据库中,连接查询的性能优化是一个非常重要的课题。MySQL 提供了多种连接算法来优化查询性能,包括 Index Nested-Loop Join 算法和 Block Nested-Loop Join 算法。理解这些算法的原理和优化方式,对于提高查询效率至关重要。

Index Nested-Loop Join 算法:查询驱动表得到数据集,然后根据数据集中的每一条记录的关联字段再分别到被驱动表中查找匹配(走索引),所以驱动表只需要访问一次,被驱动表要访问多次

MySQL 将查询驱动表后得到的记录成为驱动表的扇出,连接查询的成本:单次访问驱动表的成本 + 扇出值 * 单次访问被驱动表的成本,优化器会选择成本最小的表连接顺序(确定谁是驱动表,谁是被驱动表)生成执行计划,进行连接查询,优化方式:

  • 减少驱动表的扇出(让数据量小的表来做驱动表)

  • 降低访问被驱动表的成本

说明:STRAIGHT_JOIN 是查一条驱动表,然后根据关联字段去查被驱动表,要访问多次驱动表,所以需要优化为 INL 算法

Block Nested-Loop Join 算法:一种空间换时间的优化方式,基于块的循环连接,执行连接查询前申请一块固定大小的内存作为连接缓冲区 Join Buffer,先把若干条驱动表中的扇出暂存在缓冲区,每一条被驱动表中的记录一次性的与 Buffer 中多条记录进行匹配(扫描全部数据,一条一条的匹配),因为是在内存中完成,所以速度快,并且降低了 I/O 成本

Join Buffer 可以通过参数 join_buffer_size 进行配置,默认大小是 256 KB

在成本分析时,对于很多张表的连接查询,连接顺序有非常多,MySQL 如果挨着进行遍历计算成本,会消耗很多资源

  • 提前结束某种连接顺序的成本评估:维护一个全局变量记录当前成本最小的连接方式,如果一种顺序只计算了一部分就已经超过了最小成本,可以提前结束计算

  • 系统变量 optimizer_search_depth:如果连接表的个数小于该变量,就继续穷举分析每一种连接数量,反之只对数量与 depth 值相同的表进行分析,该值越大成本分析的越精确

  • 系统变量 optimizer_prune_level:控制启发式规则的启用,这些规则就是根据以往经验指定的,不满足规则的连接顺序不分析成本

连接优化

BKA(Batched Key Access)算法

原理:

  • BKA 算法是对 Index Nested-Loop Join (NLJ) 算法的优化。
  • 在读取被驱动表的记录时使用顺序 IO,Extra 信息中会有 Batched Key Access 信息。

使用 BKA 的表的 JOIN 过程:

  1. 连接驱动表将满足条件的记录放入 Join Buffer,并将两表连接的字段放入一个 DYNAMIC_ARRAY ranges 中。
  2. 在进行表的连接过程中,会将 ranges 相关的信息传入 Buffer 中,进行被驱动表主键的查找及排序操作。
  3. 调用步骤 2 中产生的有序主键,顺序读取被驱动表的数据。
  4. 当缓冲区的数据被读完后,会重复进行步骤 2、3,直到记录被读取完。

使用 BKA 优化需要设置:

SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
  • 前两个参数的作用是启用 Multi-Range Read (MRR),因为 BKA 算法的优化要依赖于 MRR。

BNL(Block Nested-Loop Join)算法

问题

BNL 算法由于要访问多次被驱动表,会产生两个问题:

冷表数据页移到 LRU 链表头部

  • Join 语句多次扫描一个冷表,并且语句执行时间小于 1 秒,就会在再次扫描冷表时,把冷表的数据页移到 LRU 链表头部,导致热数据被淘汰,影响业务的正常运行。
  • 这种情况冷表的数据量要小于整个 Buffer Pool 的 old 区域,能够完全放入 old 区,才会再次被读时加到 young,否则读取下一段时就已经把上一段淘汰。

Buffer Pool 的 young 区域数据页未被合理淘汰:

  • Join 语句在循环读磁盘和淘汰内存页,进入 old 区域的数据页很可能在 1 秒之内就被淘汰,就会导致 MySQL 实例的 Buffer Pool 在这段时间内 young 区域的数据页没有被合理地淘汰。
  • 大表 Join 操作虽然对 IO 有影响,但是在语句执行结束后对 IO 的影响随之结束。但是对 Buffer Pool 的影响就是持续性的,需要依靠后续的查询请求慢慢恢复内存命中率。

优化

将 BNL 算法转成 BKA 算法,优化方向:

  • 在被驱动表上建索引:这样就可以根据索引进行顺序 IO。
  • 使用临时表:在临时表上建立索引,将被驱动表和临时表进行连接查询。

驱动表 t1,被驱动表 t2,使用临时表的工作流程:

  1. 把表 t1 中满足条件的数据放在临时表 tmp_t 中。
  2. 给临时表 tmp_t 的关联字段加上索引,使用 BKA 算法。
  3. 让表 t2 和 tmp_t 做 Join 操作(临时表是被驱动表)。

补充:

MySQL 8.0 支持 hash join,join_buffer 维护的不再是一个无序数组,而是一个哈希表,查询效率更高,执行效率比临时表更高。

嵌套查询

嵌套查询是指在一个查询语句中嵌套了另一个查询语句,嵌套的查询语句称为子查询。子查询的结果可以作为外层查询的条件或数据源。根据子查询的结果和相关性,可以将嵌套查询分为不同的类型。

查询分类

根据结果分类

1、结果是单行单列:

可以将查询的结果作为另一条语句的查询条件,使用运算符判断。

SELECT 列名 FROM 表名 WHERE 列名 = (SELECT 列名/聚合函数(列名) FROM 表名 [WHERE 条件]);

2、结果是多行单列:

可以作为条件,使用运算符 IN 或 NOT IN 进行判断。

SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]);

3、结果是多行多列:

查询的结果可以作为一张虚拟表参与查询。

SELECT 列名 FROM 表名 [别名], (SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];-- 查询订单表 orderlist 中 id 大于 4 的订单信息和所属用户 USER 信息
SELECT * 
FROM USER u,(SELECT * FROM orderlist WHERE id > 4) o 
WHERE u.id = o.uid;

根据相关性分类

  • 不相关子查询:子查询不依赖外层查询的值,可以单独运行出结果。
  • 相关子查询:子查询的执行需要依赖外层查询的值。

查询优化

物化

1、不相关子查询的结果集会被写入一个临时表,并且在写入时去重,该过程称为物化。

2、存储结果集的临时表称为物化表。

3、系统变量 tmp_table_size 或 max_heap_table_size 为表的最值。

  • 小于系统变量时,内存中可以保存,会为建立基于内存的 MEMORY 存储引擎的临时表,并建立哈希索引。
  • 大于任意一个系统变量时,物化表会使用基于磁盘的 InnoDB 存储引擎来保存结果集中的记录,索引类型为 B+ 树。

半连接

  1. 物化后,嵌套查询就相当于外层查询的表和物化表进行内连接查询,然后经过优化器选择成本最小的表连接顺序执行查询。
  2. 子查询物化会产生建立临时表的成本,但是将子查询转化为连接查询可以充分发挥优化器的作用,所以引入半连接。
  3. 半连接只是执行子查询的一种方式,MySQL 并没有提供面向用户的半连接语法。

联合查询

UNION 和 UNION ALL 是用于合并多个查询结果集的操作符。

  • UNION 是取这两个子查询结果的并集,并进行去重,同时进行默认规则的排序。
  • UNION ALL 是对两个结果集进行并集操作不进行去重,不进行排序。
(SELECT 1000 AS f) UNION (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); # t1 表中包含 id 为 1-1000 的数据

语句的执行流程:

  1. 创建一个内存临时表,这个临时表只有一个整型字段 f,并且 f 是主键字段。
  2. 执行第一个子查询,得到 1000 这个值,并存入临时表中。
  3. 执行第二个子查询,拿到第一行 id=1000,试图插入临时表中,但由于 1000 这个值已经存在于临时表了,违反了唯一性约束,所以插入失败,然后继续执行。
  4. 取到第二行 id=999,插入临时表成功。
  5. 从临时表中按行取出数据,返回结果并删除临时表,结果中包含两行数据分别是 1000 和 999。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Shelly实测天工的音乐创作功能,写了一首歌,来听听效果

​ 大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 在数字时代的洪流中,我始终…

C语言 fwirte 函数 - C语言零基础入门教程

目录 一.fwirte 函数简介二.fwirte 函数使用三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.fwirte 函数简介 C 语言文件读写,fread 函数用于读取文件中的数据到指定缓冲区中,而 fwrite 函数用于把缓冲区数据写入到文件…

Linux(麒麟系统)多显示器屏幕录制

Linux桌面设备在接入多显示器的情况下,有些只录主显示器,有些场景要单独录制每个显示器,X Window System支持多显示器配置和显示器列表获取,需要XRandR 1.5及以上版本,查看RandR version 命令: xrandr --version 使用x…

MCU和YT9218交换机通过RMII连接

1、可以通过带RMII的MCU和EXT1端口连接,将MCU配置为RMII 100M/全双工就可以通 2、原先在这里改SW配置, 一直不通 3、后来通过api调用可以通 这样改: 在初始化后,添加下面代码 //使能RMII,phy模式 #define Port5 …

pycharm安装教程,超详细

引言 PyCharm官网提供了两个版本,第一个版本是Professional(专业版本),这个版本功能更加强大,主要是为Python和web开发者而准备,是需要付费的。第二个版本是社区版(Community)&…

10月23-27日六西格玛绿带公开课即将在雄安新区开课

在金秋送爽、硕果累累的季节里,天行健管理咨询公司宣布了一项重要决定——定于10月23日至27日,在充满未来气息的河北雄安新区,举办一场旨在提升企业质量管理水平、培养精英人才的六西格玛绿带公开课。此次课程的举办,不仅是对当前…

LeetCode 每日一题 ---- 【1014. 最佳观光组合】

LeetCode 每日一题 ---- 【1014. 最佳观光组合】 1014.最佳观光组合题解:枚举右 维护左 1014.最佳观光组合 题解:枚举右 维护左 先对题目中的式子进行变形 values[i] values[j] i - j > (values[i] i) (values[j] - j) 枚举右端点 j&#xf…

活动报名| 探索存内计算的未来,共话AGI时代

活动日期:2024年09月28日 下午一点到6点 地点:杭州技术转移中心 三楼路演厅 议程亮点: 存内计算技术架构以及最新趋势AGI开源项目交流存内计算实操上板体验 存内计算 ——突破物理极限的下一代算力技术 直接消除“存”“算”界限&…

2024/9/22周报

文章目录 摘要Abstract可能的数据结构数据集结构 数据处理步骤数据集示例人工智能模型应用关键评估目标评价指标分类应用实例最终目标多目标优化的基本概念1. Pareto最优解(Pareto Optimality)2. 目标权重法(Weighted Sum Method)…

二.python基础语法

目录 1.第一个python实例 2.python编码规范 2.1.编写规则 2.2.命名规范 2.3. 空格 2.4. 缩进 2.5. 注释 3.python关键字和标识符 3.1.标识符 3.2.关键字 4.python变量 4.1. 定义变量 4.2. 变量类型是可变的 4.3. 多个变量指向同一个值 5.python基本数据类型 5.…

基于vue框架的传统文化传播网站设计与实现f7r43(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,文化类型,传统文化 开题报告内容 基于Vue框架的传统文化传播网站设计与实现开题报告 一、研究背景 在全球化加速的今天,各国文化相互交融,但也面临着传统文化被边缘化的风险。中国拥有五千年文明史&#…

ai绘画工具Playground v3:重新定义AI图像生成

Playground AI是一款免费的在线AI绘画工具,它使用深度学习技术帮助用户将文字和图片转换成高质量的图像,非常适合创作艺术作品、社交媒体内容、演示文稿、海报、视频和logo等。这个工具不仅支持文生图和图生图,还提供图像编辑功能&#xff0c…

2024年找工作怎么这么难?网工该何去何从?

2024年,找工作对很多人来说都变得更加艰难,网络工程师也不例外,仿佛是寒冬一般。 招聘岗位数量骤减,求职竞争加剧,很多人在职场上感受到前所未有的压力。 你可能觉得这是行业的末日,但实际上,这…

论文集搜索网站-dblp 详细使用方法

分享在dblp论文集中的两种论文搜索方式:关键字搜索,指定会议/期刊搜索。 关键字搜索 进入dblp官方网址dblp: computer science bibliography,直接在上方搜索栏,搜索关键字,底下会列出相关论文。 指定会议/期刊搜索 …

postgres导入sql文件的方法

首先,要打开CMD,cd到postgreSQL的bin路径 在下面这个例子里,player是数据库名称,postgres是用户名 添加完成之后,打开客户端 可以看到所有表已经全部导入

基于ssm框架的博客系统

基于ssm框架的博客系统的开发 ssm640基于ssm框架的博客系统的开发vue 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框…

如何着手创建企业数据目录?(四)数据质量与标准化

前文导读: 《如何着手创建企业数据目录?(一)数据目录的设定》 《如何着手创建企业数据目录?(二)数据的命名与维护》 《如何着手创建企业数据目录?(三)权限管理…

顶会创新点速递!强化学习+注意力机制,发文香饽饽!

强化学习结合注意力机制的研究在学术界和工业界都引起了广泛关注,因为它能显著提升模型处理复杂任务的效率和准确性,迅速成为了各大顶会的投稿热门。目前,强化学习注意力机制主要有三大研究方向:状态表示、动作选择、奖励预测。 …

2012-2019全球地表平均夜光年度数据

数据详情 2012-2019全球地表平均夜光年度数据 数据属性 数据名称:全球地表平均夜光年度数据 数据时间:2012-2019 空间位置:全球 数据格式:tif 空间分辨率:1500米 时间分辨率:年 坐标系:…

SD教程:一键将真人照片转成插画风格头像,秒变二次元动漫主角~

大家好,我是灵魂画师向阳 如今AI技术日益成熟,今天给大家分享一个用AI绘画工具StableDiffusion制作真实头像转插画的教程,废话不多说,上操作。 本期教程我们将以SD为作图工具,如果你还没有安装使用过AI绘画工具Stable…