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

【MySQL】窗口函数详解(概念+练习+实战)

文章目录
  • 前言
  • 1. SQL窗口函数
    • 1.1 窗口函数概念
    • 1.2 窗口函数语法
    • 1.3 常见窗口函数
      • 1.3.1 聚合窗口函数
      • 1.3.2 专用窗口函数
    • 1.4 窗口函数性能比较
  • 2. LeetCode 例题
    • 2.1 LeetCode SQL 178:分数排名
    • 2.2 LeetCode SQL 184:最高工资
    • 2.3 LeetCode SQL 185:前三工资
  • 3. 项目实战
    • 3.1 需求描述
    • 3.2 SQL 实战
  • 4. 补充与总结
    • 4.1 `ROWS BETWEEN`子句常见关键字含义
    • 4.2 如何理解窗口函数的“窗口”?
    • 4.3 总结
  • 参考资料
牛逼的兄弟两个月前教了我一招…

前言

2023年12月下旬,广东终于冷了!回想直到12月15那天,依然穿着短袖上班,吹着风扇空调睡觉… 哈哈,这是截至发文时的一些感受与题外话。天气是冷了,但心中依然热情似火,一是工作业务上又有稍微复杂的业务,有挑战;二是虽然有挑战,但想起牛逼的兄弟@CaptinKoo两个月前教了我一招:SQL窗口函数,业务难题迎刃而解!趁着这次解决难题的热度,将本次学到的窗口函数知识点以及项目实战记录下来,供各位分享。

我个人学习窗口函数主要有两个用处:一是对现有SQL知识的拓展,二是能使用窗口函数对一些特定场景做SQL简化,解决复杂问题。

但在正式开始之前,得事先说明一个前提:
前提

  • 窗口函数是 Mysql 8 的新特性。本文的学习与演示,都基于Mysql 8
  • 学习窗口函数,建议有一定的SQL基础

学习目标

  • 学习并了解SQL窗口函数相关概念
  • 能使用SQL窗口函数解决部分业务场景题目,项目实战
  • 若实际业务用得少,那上述知识了解一下即可,建议收藏本文,用到的时候可以翻出来参考

下面我们开始!

1. SQL窗口函数

这一小节我们介绍窗口函数的一些概念。

1.1 窗口函数概念

概念
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。

窗口函数在MySQL 8中引入,是Mysql 8的新特性。是一种主要用于数据分析、特定字段分组等的一种特殊的函数。

常见使用场景

  • 数据分析,如排名、排序、分组统计、计算、前后值比较等
  • 对某些分组场景简化SQL,提升效率
  • 常用于子查询,将一些复杂条件简化

1.2 窗口函数语法

窗口函数的语法如下:

窗口函数([参数]) OVER ([PARTITION BY <分组列>] [ORDER BY <排序列 ASC/DESC>][ROWS BETWEEN 开始行 AND 结束行]
)
  • PARTITION BY 子句用于指定分组列,关键字:PARTITION BY
  • ORDER BY 子句用于指定排序列,关键字ORDER BY
  • ROWS BETWEEN 子句用于指定窗口的范围,关键字ROWS BETWEEN 即[开始行]、[结束行](这部分在“补充与总结”小节中作补充详细说明)。

其中,ROWS BETWEEN 子句在实际中可能用得相对少一些,因此有部分参考资料的语法描述省略了ROWS BETWEEN 子句,主要侧重于PARTITION BY分组与ORDER BY排序:

窗口函数([参数]) OVER ([PARTITION BY <分组列>] [ORDER BY <排序列 ASC/DESC>]

也正因此,本文将ROWS BETWEEN 子句相关关键字知识点将会以补充的形式说明,而侧重常用窗口函数的学习与练习,侧重PARTITION BY 子句与ORDER BY子句的使用。

语法举例,设有Order表,查询销售数量总和及其当前行前两行和后两行的销售数量总和:

SELECT product_id, order_date, quantity,SUM(quantity) OVER (PARTITION BY product_id ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS sum_surrounding_quantities
FROM orders

这个例子暂时看不懂个没关系,接下来,我们会详细介绍常见窗口函数,并在介绍的过程中举例。之后,上述例子就很好理解了。

1.3 常见窗口函数

本小节介绍常见窗口函数。

若要跟着本文进行练习,则可以参考着创建如下表,本文的例子均基于下表:

设计一个销售数据表。该表包含以下字段:

  • id :销售记录的唯一标识符(主键)
  • product :产品名称
  • category :产品类别
  • sale_date :销售日期
  • quantity :销售数量
  • revenue :销售收入

以下是创建表的DDL以及 插入模拟数据的DML

CREATE TABLE sales (id INT PRIMARY KEY,product VARCHAR(50),category VARCHAR(50),sale_date DATE,quantity INT,revenue DECIMAL(10, 2)
);INSERT INTO sales (id, product, category, sale_date, quantity, revenue)
VALUES(1, 'Product A', 'Category 1', '2022-01-01', 10, 100.00),(2, 'Product B', 'Category 1', '2022-01-01', 5, 50.00),(3, 'Product A', 'Category 2', '2022-01-02', 8, 80.00),(4, 'Product B', 'Category 2', '2022-01-02', 3, 30.00),(5, 'Product A', 'Category 1', '2022-01-03', 12, 120.00),(6, 'Product B', 'Category 1', '2022-01-03', 7, 70.00),(7, 'Product A', 'Category 2', '2022-01-04', 6, 60.00),(8, 'Product B', 'Category 2', '2022-01-04', 4, 40.00);

好的,准备工作完成,下面我们一边学习具体窗口函数并练习吧!

1.3.1 聚合窗口函数

许多窗口函数的教程,通常将常用的窗口函数分为两大类:聚合窗口函数 与 专用窗口函数。聚合窗口函数的函数名与普通常用聚合函数一致,功能也一致。从使用的角度来讲,与普通聚合函数的区别在于提供了窗口函数的专属子句,来使得数据的分析与获取更简便。主要有如下几个:

函数名

作用

SUM

求和

AVG

求平均值

COUNT

求数量

MAX

求最大值

MIN

求最小值

区别
这个例子演示与普通聚合函数的区别。设我们要求使用一条查询语句,在sales表每行最后一列都加上这一行的产品类别 category的 平均 销售收入revenue,并且以category顺序排序,即如下图所示:
00

  • 普通聚合函数的一种解法:

    SELECT
    t1.*,
    t2.avg_revenue FROM sales t1
    LEFT JOIN (
    SELECT category, AVG(revenue) AS avg_revenue
    FROM sales
    GROUP BY category
    ) t2 ON t1.category = t2.category ORDER BY t1.category

  • 聚合窗口函数:

    SELECT
    sales.*,
    AVG( revenue ) OVER ( PARTITION BY category ) AS avg_revenue
    FROM
    sales

这么一对比,窗口聚合函数简单不少!

1.3.2 专用窗口函数

常见的专用窗口函数

函数名

分类

说明

RANK

排序函数

类似于排名,并列的结果序号可以重复,序号不连续

DENSE_RANK

排序函数

类似于排名,并列的结果序号可以重复,序号连续

ROW_NUMBER

排序函数

对该分组下的所有结果作一个排序,基于该分组给一个行数

PERCENT_RANK

分布函数

每行按照公式 (rank-1) / (rows-1) 进行计算

CUME_DIST

分布函数

分组内小于、等于当前 rank 值的行数 / 分组内总行数

练习
分别对上述表格常见的专用窗口函数进行调用,查看结果。

SELECT *,RANK() OVER(PARTITION BY category ORDER BY quantity DESC) AS `quantity_rank`,DENSE_RANK() OVER(PARTITION BY category ORDER BY product DESC) AS `product_dense_rank`,ROW_NUMBER() OVER(PARTITION BY category ORDER BY product DESC) AS `product_row_number`,PERCENT_RANK() OVER(PARTITION BY category ORDER BY quantity DESC) AS `quantity_percent_rank`,CUME_DIST() OVER(PARTITION BY category ORDER BY quantity DESC) AS `quantity_cume_dist`
FROM sales

01

至于其它专用窗口函数,请读者自行查阅其它资料做拓展。

1.4 窗口函数性能比较

通过对上面我们对窗口函数的学习与练习,我们一来明白了窗口函数的相关概念、常见窗口函数的使用以及这些窗口函数的作用与效果。也通过窗口函数与一般函数子查询作了一个简单的对比,体现了窗口函数在一些特定需求的强大。那么既然窗口函数如此强大,那么窗口函数的性能对比传统函数、传统子查询与分组的性能相比如何呢?

窗口函数的性能和其它SQL语句一样,受数据量大小、分区复杂度情况等影响。同等数量级的一般情况下:

  • 窗口函数本身内嵌分组,相当于把条件先筛了一遍,可减少部分子查询。减少的子查询部分相当于降低了子查询本身的连接消耗。
  • 窗口函数窗口大小限制,可减少部分行数结果返回消耗。
  • 窗口函数可用于子查询,简化部分语句。但又因为用在了子查询,还是有一定连接开销。
  • 窗口聚合函数在窗口函数原有分区、排序的基础上增加了聚合,且因不会影响行数的关系,比原有分组行数要多,其开销比一般聚合函数开销要大一些,因此窗口聚合函数一般情况下会比普通聚合函数性能差一些。

当然,上述只是理论上的性能初步分析,实际还得视具体的情况而定。
至于窗口函数优化方案,可以以影响窗口函数性能的原因为切入点由因到果进行优化,例如缩小窗口大小限制。篇幅有限,不作详解。详情可参考文末推荐的优秀参考文章。

2. LeetCode 例题

上一小节,我们学习了 SQL 窗口函数的概念,从本小节开始,就是做题练习与实战了!

接下来要列举例题,是 @CaptinKoo 两个月前教我们窗口函数时提供的练习题。让我们跟随 @CaptinKoo 老师的脚步,进行窗口函数练习吧!

2.1 LeetCode SQL 178:分数排名

题目链接
LeetCode-SQL178分数排名链接

题目描述
05

06

题解
根据题目描述,我们得知,返回结果序号可重复,连续,因此我们使用DENSE_RANK()函数。

SELECT score,DENSE_RANK() OVER(ORDER BY score DESC) AS `rank`
FROM Scores 
ORDER BY score DESC

2.2 LeetCode SQL 184:最高工资

题目链接
LeetCode-SQL184部门工资最高的员工

题目描述

07
08

题解
根据描述,我们可以通过 RANK 窗口函数对 Employee 表进行排序,获取 rank 值为1 的 员工并关联到部门表。

SELECT d.name AS Department,e.name AS Employee,e.salary AS Salary
FROM (SELECT name, salary,departmentId, RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS `rank`FROM Employee
) e 
LEFT JOIN Department d ON e.departmentId = d.id
WHERE e.`rank` = 1

2.3 LeetCode SQL 185:前三工资

题目链接
LeetCode-SQL185部门工资前三高的所有员工

题目描述

03

04

题解
有了上面两道题的解题练习,这道题也迎刃而解:

SELECT d.name AS Department,e.name AS Employee,e.salary AS Salary
FROM (SELECT name, salary,departmentId, DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS `rank`FROM Employee
) e 
LEFT JOIN Department d ON e.departmentId = d.id
WHERE e.`rank` <= 3

太棒了!我们一下就完成了三道包括中等、困难难度的LeetCode题目,接下来,我们可以将我们学习并练习过的知识点用于项目实战了!

3. 项目实战

本小节是我个人用窗口函数解决实际工作问题的实战记录。涉及的表、字段均已做描述更换,脱敏处理。

3.1 需求描述

已知用户订单评价表order_evaluate有如下字段:

字段名

类型

说明

id

bigint

评价表主键id

evaluate

text

评价内容

user_id

bigint

用户id

update_time

datetime

更新时间

order_id

bigint

订单id

其中,每个订单可以有多个评价,每个评价都可以修改。业务需要,需要获取当前用户所有订单最近一次评价内容,并返回订单id、最近一次评价的内容。

3.2 SQL 实战

此次实战业务需要根据update_time获取最近一次评论并根据order_id进行分组。

在尚未系统学习窗口函数时,我们第一时间会想到的是传统子查询。

但毕竟实际业务远比这里的脱敏描述要复杂,一时间难以实现,于是我第一时间回顾了@CaptinKoo大佬教我的窗口函数并解决:

# 毕竟是Demo,忽略 user_id 条件,实际业务会补充齐全其它条件
SELECTt1.order_id,evaluate
FROMorder_evaluate t1INNER JOIN ( SELECT id, order_id, ROW_NUMBER() OVER ( PARTITION BY order_id ORDER BY update_time DESC ) AS row_num FROM order_evaluate) t2 ON t1.id = t2.id 
WHEREt2.row_num = 1

这条SQL是通过ROW_NUM()函数将工单评价表根据工单分组,更新时间倒序并给它一个行序号。行序号1的就是我们要求的结果。

你能想到用传统子查询实现相同功能的SQL吗?

4. 补充与总结

4.1 ROWS BETWEEN子句常见关键字含义

关键字及其含义表

关键字

含义

PRECEDING

当前行数往前

FOLLOWING

当前行数往后

CURRENT ROW

当前行

UNBOUNDED

起点(一般结合PRECEDING,FOLLOWING使用)

UNBOUNDED PRECEDING

表示该窗口最前面的行(起点)

UNBOUNDED FOLLOWING

表示该窗口最后面的行(终点)

此表的知识内容来自于参考文章

根据这个关键字含义表,读者可以理解文初提到的例子了吗?

可选挑战题目
这里提供一题可选的挑战题目链接,是LeetCode困难题目,依然来自@CaptinKoo大佬的推荐,此题的一种解法用到ROWS BETWEEN子句。

LeetCode-601体育馆的人流量

4.2 如何理解窗口函数的“窗口”?

既然这种函数叫"窗口函数",那么它应该可以像"窗口"一样,通过滚动的方式,获取一定范围内的视图。

而滚动的方式恰恰就是ROWS BETWEEN子句。通过ROWS BETWEEN子句,获取窗口函数结果的范围,从而有给用户"窗口"的感觉。

用术语表达,则是:通过定义帧,决定窗口的大小。
窗口函数定义帧通常有两种方式:RANGEROWS, 两者决定窗口帧的边界如何计算。

  • RANGE 基于排序列的值定义帧
  • ROWS 基于行数定义帧,不考虑排序列

由于两者用法相似,且一般ROWS BETWEEN 子句会用得多一些,因此本文的语法概述忽略了RANGE子句。此处作为补充,供读者参考。

4.3 总结

本文借由好兄弟@CaptinKoo两个月前教过我的窗口函数知识,截至发文日期顺利解决一个相对比较复杂的业务的故事,记录我从CaptinKoo学到的窗口函数相关知识,以及CaptinKoo大佬推荐的相关习题,以及我个人本次实战的脱敏描述。

通过本文,我们学习到了:

  • Mysql 窗口函数相关概念:其中,语法结构是重点;
  • 常见窗口函数:聚合窗口函数、专用窗口函数(排序函数、分布函数等)
  • 相关习题与练习
  • 一个实际的练习供大佬们参考
  • 窗口函数“窗口”的体现,ROWS BETWEEN子句相关补充知识点

参考资料

  • 知乎-窗口函数优秀参考文章1
  • 知乎-窗口函数优秀参考文章2
  • CSDN-窗口函数优秀参考文章1
  • CSDN-窗口函数优秀参考文章2

再次感谢@CaptinKoo的指导!

相关文章:

【MySQL】窗口函数详解(概念+练习+实战)

文章目录 前言1. SQL窗口函数 1.1 窗口函数概念1.2 窗口函数语法1.3 常见窗口函数 1.3.1 聚合窗口函数1.3.2 专用窗口函数 1.4 窗口函数性能比较 2. LeetCode 例题 2.1 LeetCode SQL 178&#xff1a;分数排名2.2 LeetCode SQL 184&#xff1a;最高工资2.3 LeetCode SQL 185&am…...

c语言对应汇编写法(以中微单片机举例)

芯片手册资料 1. 赋值语句 C语言&#xff1a; a 5; b a; 汇编&#xff1a; ; 立即数赋值 LDIA 05H ; ACC 5 LD R01,A ; R01 ACC&#xff08;a5&#xff09;; 寄存器间赋值 LD A,R01 ; ACC R01&#xff08;读取a的值&#xff09; LD R02,A ; R02 ACC&…...

前端组件标准化专家Prompt指令的最佳实践

前端组件标准化专家Prompt 提示词可作为项目自定义提示词使用&#xff0c;本次提示词偏向前端开发的使用&#xff0c;如有需要可适当修改关键词和示例 推荐使用 Cursor 中作为自定义指令使用Cline 插件中作为自定义指令使用在力所能及的范围内使用最好的模型&#xff0c;可以…...

开发板目录 /usr/lib/fonts/ 中的字体文件 msyh.ttc 的介绍【微软雅黑(Microsoft YaHei)】

本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸扩展。 本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸扩展。 问&#xff1a;运行 ls /usr/lib/fonts/ 发现有一个名叫 msyh.ttc 的字体文件&#xff0c;能介绍…...

18爬虫:关于playwright相关内容的学习

1.如何在python中安装playwright 打开pycharm&#xff0c;进入终端&#xff0c;输入如下的2个命令行代码即可自动完成playwright的安装 pip install playwright ——》在python中安装playwright第三方模块 playwright install ——》安装playwright所需的工具插件和所支持的…...

docker Error response from daemon: Get “https://registry-1.docker.io/v2/ 的问题处理

docker Error response from daemon: Get "https://registry-1.docker.io/v2/ 的问题处理 最近pull 数据 发现 docker 有如下错误 文章目录 docker Error response from daemon: Get "https://registry-1.docker.io/v2/ 的问题处理报错问题检查网络连接解决方案&…...

拉取本地的 Docker 镜像的三种方法

方法 1&#xff1a;通过 docker save 和 docker load 导出和导入镜像 在本地服务器上导出镜像&#xff1a; 使用 docker save 将镜像保存为一个 .tar 文件&#xff1a; docker save -o mysql-5.7.tar mysql:5.7 将镜像文件传输到其他服务器&#xff1a; 你可以通过 scp 或其他…...

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途

1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多&#xff0c;删除代价也小。这种说法主要基于以下几个方面&#xff1a; &#xff08;1&#xff09;资源共享 内存空间&#xff1a;每个进程都有自己独立的内存空间&#xff0c;包括代码段…...

老榕树的Java专题:Redis 从入门到实践

一、引言 在当今的软件开发领域&#xff0c;数据的高效存储和快速访问是至关重要的。Redis&#xff08;Remote Dictionary Server&#xff09;作为一个开源的、基于内存的数据结构存储系统&#xff0c;因其高性能、丰富的数据类型和广泛的应用场景&#xff0c;成为了众多开发者…...

123,【7】 buuctf web [极客大挑战 2019]Secret File

进入靶场 太熟悉了&#xff0c;有种回家的感觉 查看源代码&#xff0c;发现一个紫色文件 点下看看 点secret 信息被隐藏了 要么源代码&#xff0c;要么抓包 源代码没有&#xff0c;抓包 自己点击时只能看到1和3处的文件&#xff0c;点击1后直接跳转3&#xff0c;根本不出…...

微服务知识——微服务拆分规范

文章目录 一、微服务拆分规范1、高内聚、低耦合2、服务拆分正交性原则3、服务拆分层级最多三层4、服务粒度适中、演进式拆分5、避免环形依赖、双向依赖6、通用化接口设计&#xff0c;减少定制化设计7、接口设计需要严格保证兼容性8、将串行调用改为并行调用&#xff0c;或者异步…...

docker数据持久化的意义

Docker 数据持久化是指在 Docker 容器中保存的数据不会因为容器的停止、删除或重启而丢失。Docker 容器本身是临时性的&#xff0c;默认情况下&#xff0c;容器内的文件系统是临时的&#xff0c;容器停止或删除后&#xff0c;其中的数据也会随之丢失。为了确保重要数据&#xf…...

双目标定与生成深度图

基于C#联合Halcon实现双目标定整体效果 一&#xff0c;标定 1&#xff0c;标定前准备工作 &#xff08;获取描述文件与获取相机参数&#xff09; 针对标准标定板可以直接调用官方提供描述文件&#xff0c;也可以自己生成描述文件后用PS文件打印 2&#xff0c;相机标定 &…...

【SQL】count(1)、count() 与 count(列名) 的区别

在 SQL 中&#xff0c;COUNT 函数用于计算查询结果集中的行数。COUNT(1)、COUNT(*) 和 COUNT(列名) 都可以用来统计行数&#xff0c;但它们在实现细节和使用场景上有一些区别。以下是详细的解释&#xff1a; 1. COUNT(1) 定义: COUNT(1) 计算查询结果集中的行数。 实现: 在执…...

使用bucardo实现postgresql数据库双主同步

使用bucardo实现postgresql数据库双主同步 方案优缺点 优点 pg数据库只支持单向数据复制&#xff0c;双机部署一般只能使用主&#xff08;读写&#xff09;备&#xff08;只读&#xff09;模式。而使用bucardo能实现pg数据库双机的双主模式&#xff0c;支持同时双写&#xf…...

在 Navicat 17 中扩展 PostgreSQL 数据类型 | 创建自定义域

定义域 以适当的格式存储数据可以确保数据完整性&#xff0c;防止错误&#xff0c;优化性能&#xff0c;并通过实施验证规则和支持高效数据管理来维护系统间的一致性。基于这些原因&#xff0c;顶级关系数据库&#xff08;如PostgreSQL&#xff09;提供了多种数据类型。此外&a…...

【Apache Paimon】-- 15 -- 利用 paimon-flink-action 同步 postgresql 表数据

利用 Paimon Schema Evolution 核心特性同步变更的 postgresql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工消息通知,然后手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hi…...

获取 ARM Cortex - M 系列处理器中 PRIMASK 寄存器的值

第一种实现&#xff08;纯汇编形式&#xff09; __ASM uint32_t __get_PRIMASK(void) {mrs r0, primaskbx lr }代码分析 __ASM 关键字&#xff1a;这通常是特定编译器&#xff08;如 ARM GCC 等&#xff09;用于嵌入汇编代码的指示符。它告诉编译器下面的代码是汇编代码。mrs …...

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】

&#x1f380;&#x1f380;Shell语法入门篇 系列篇 &#x1f380;&#x1f380; LinuxDocer 容器化部署之 Shell 语法入门篇 【准备阶段】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell变量】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell数组与函数】LinuxDocer 容…...

如何处理网络连接错误导致的fetch失败?

处理由于网络连接错误导致的 fetch 失败通常涉及捕获网络错误并提供适当的用户反馈。以下是如何在 Vue 3 中实现这一点的步骤和示例。 一、更新 useFetch 函数 在 useFetch 函数中,需要捕获网络错误,并设置相应的错误信息。网络错误通常会抛出一个 TypeError,可以根据这个…...

PHP PDO 教程

PHP PDO 教程 概述 PHP PDO&#xff08;PHP Data Objects&#xff09;扩展为PHP提供了数据访问抽象层。PDO可以让你使用相同的接口访问多种数据库系统&#xff0c;这大大简化了数据库操作。本文将详细介绍PHP PDO的基本用法、优势以及在实际开发中的应用。 ##PDO 简介 PDO是…...

离线统信系统的python第三方库批量安装流程

一、关于UOS本机 操作系统&#xff1a;UOS&#xff08;基于Debian的Linux发行版&#xff09; CPU&#xff1a;海光x86 二、具体步骤 1、在联网的电脑上用控制台的pip命令批量下载指定版本的第三方库 方法A cd <目标位置的绝对路径> pip download -d . --platform many…...

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台&#xff0c;第一次需要注册一个账号 进去之后需要创建一个API KEY&#xff0c;然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址&#xff0c;点击左边的&#xff1a;接口…...

mysql的原理及经验

1. 存储引擎 存储引擎是MySQL的核心组件之一&#xff0c;它负责数据的存储和检索。MySQL支持多种存储引擎&#xff0c;每种引擎都有其独特的特点和适用场景。 InnoDB&#xff1a;这是MySQL的默认存储引擎&#xff0c;支持事务处理&#xff08;ACID特性&#xff09;、行级锁定和…...

苹果公司宣布正式开源 Xcode 引擎 Swift Build145

2025 年 2 月 1 日&#xff0c;苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言&#xff0c;用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生&#xff1a;2014 年&#xff0c;苹果在全球…...

怀旧经典:1200+款红白机游戏合集,Windows版一键畅玩

​沉浸在怀旧的海洋中&#xff0c;体验经典红白机游戏的魅力&#xff01;我们为您精心准备了超过1200款经典游戏的合集&#xff0c;每一款都是时代的印记&#xff0c;每一场都是回忆的旅程。这个合集不仅包含了丰富的游戏资源&#xff0c;还内置了多个Windows版的NES模拟器&…...

《解锁GANs黑科技:打造影视游戏的逼真3D模型》

在游戏与影视制作领域&#xff0c;逼真的3D模型是构建沉浸式虚拟世界的关键要素。从游戏中栩栩如生的角色形象&#xff0c;到影视里震撼人心的宏大场景&#xff0c;高品质3D模型的重要性不言而喻。随着人工智能技术的飞速发展&#xff0c;生成对抗网络&#xff08;GANs&#xf…...

【漫话机器学习系列】083.安斯库姆四重奏(Anscombe‘s Quartet)

安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09; 1. 什么是安斯库姆四重奏&#xff1f; 安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09;是一组由统计学家弗朗西斯安斯库姆&#xff08;Francis Anscombe&#xff09; 在 1973 年 提出的 四组数据集。它们…...

kafka消费端之分区分配策略

文章目录 概述分区分配策略RangeAssignor分配策略RoundRobinAssignor分配策略StickyAssignor自定义分区分配策略 总结 概述 我们知道kafka的topic可以被分成多个分区&#xff0c;消费者在集群模式下消费时一个消费组内的每个消费者实例只能消费到一个分区的消息&#xff0c;那…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...