MySQL-窗口函数
窗口函数
- 概念
- 常用窗口函数
- 聚合窗口函数
- 专用窗口函数
- 语法
- OVER子句
- window_spec
- window_name (命名窗口)
- partition_clause 分区
- order_clause 排序
- frame_clause 范围 (指定窗口大小)
- 使用限制
- 练习
- 准备
概念
窗口函数对一组查询执行类似于聚合的操作。然而,聚合操作将查询行分组为
单个结果行
,而窗口函数为每个查询行
生成一个结果;
查询中的每个窗口操作都通过包含一个
OVER
子句来表示,该子句指定如何将查询行划分为组以供窗口函数处理:
- 第一个OVER子句为空,它将整个查询行集视为一个分区。窗口函数因此产生一个全局
计算结果
,但对每一行都这样做。- 第二个OVER子句按对应的分区,生成每个组的
计算结果
。该函数为每个分组行生成次计算结果
窗口函数只允许在
选择列表(类似于需要显示的字段)
和ORDER BY
子句中使用。查询结果行由FROM
子句确定,在WHERE
、GROUP BY
和HAVING
处理之后,,窗口执行发生在ORDER BY
、LIMIT
和SELECT DISTINCT
之前。
常用窗口函数
聚合窗口函数
- AVG() –
窗口
内平均数 - COUNT() –
窗口
内数据 - MAX() –
窗口
内最大值 - MIN() –
窗口
内最小值 - SUM() –
窗口
内求和
当聚合函数带有OVER()子句是则该函数为聚合窗口函数
专用窗口函数
- ROW_NUMBER() ---- 行号
- RANK() · ----
分区
内的排名,有间隙(间隙指同排名会继续往后排) - DENSE_RANK() ----
分区
内的排名,没有间隙 - PERCENT_RANK() ----
分区
内的百分比排名,没有间隙 - LAG() ----
分区
内向上平移 - LEAD() ----
分区
内向下平移 - NTILE() ----
分区
(平均的划分) 得到的当前行是第几桶 - FIRST_VALUE() ----
窗口
内的第一行 - LAST_VALUE() ----
窗口
内的最后一行 - NTH_VALUE() ----
窗口
内第几行的数据
专用窗口函数必须要有OVER()子句
分区与窗口的区别
分区
为 partition by 执行过后的所以行 称之为分区 如果没有partition by 则所有行称之为分区当我们的分区加上了
rows|range
他们指定的范围内的数据称之为窗口
语法
OVER子句
# 有两种形式定义OVER 子句
over_clause:{OVER (window_spec) | OVER window_name}
window_spec
# 以下几个部分都是可选的
window_spec:[window_name] [partition_clause] [order_clause] [frame_clause]
如果OVER() 为空,则分区由所有查询行组成,窗口函数使用所有行计算结果。否则,括号内的子句确认哪些查询行用于计算函数结果以及他们如何分区、窗口和排序:
window_name (命名窗口)
可以定义窗口并为他指定名称,以便在
OVER
子句中引用它们,使用WINDOW
关键字定义,WINDOW
子句位于HAVING
和ORDER BY
之间
WINDOW window_name as(window_spec)[,window_name as (window_spec)]...
SELECTDISTINCT year, country,# 可以继续添加 window_name 中没有的子句FIRST_VALUE(year) OVER (w ORDER BY year ASC) AS first, FIRST_VALUE(year) OVER (w ORDER BY year DESC) AS last
FROM sales
WINDOW w AS (PARTITION BY country);
window_name可以互相引用但是不能循环引用
partition_clause 分区
一个
PARTITION BY
子句 指示如何将查询行分区。给定行的窗口函数结果基于包含该行的分区的行查询。如果
PARTITION BY
忽略,则存在所有查询行组成的单个分区
PARTITION BY 语法
PARTITION BY expr [,expr1] ...
order_clause 排序
order_clause:ORDER BY expr [ASC|DESC] [,expr1 [ASC|DESC]] ...
frame_clause 范围 (指定窗口大小)
frame_clause:frame_units frame_extentframe_units:{ROWS | RANGE}frame_extent:{frame_start | frame_between}frame_between:BETWEEN frame_start AND frame_end
FOLLOWING
frame_start, frame_end: {CURRENT ROW -- 当前行| UNBOUNDED PRECEDING -- 之前所有含当前行| UNBOUNDED FOLLOWING -- 之后所有含当前行| expr PRECEDING -- 当前行 之前的expr行 不包含当前行| expr FOLLOWING -- 当前行 之后的expr行 不包含当前行
}
如果没有 frame_clause 则会取决于order_clause是否存在
存在
则当前分区的开始到当前行 包含当前行
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
不存在
则默认为当前分区的所有行
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
使用限制
- 不支持在
UPDATE
orDELETE
中使用 - 不允许嵌套窗口
练习
准备
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (1, '可比克', '食品', 'a', 10, '2022-01-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (2, '乐事', '食品', 'b', 15, '2022-01-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (3, '布洛芬', '药品', 'a', 50, '2022-02-11');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (4, '999感冒灵', '药品', 'b', 20, '2022-03-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (5, '连花清瘟胶囊', '药品', 'c', 100, '2022-04-03');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (6, '扫把', '日用品', 'b', 10, '2022-05-05');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (7, '拖把', '日用品', 'b', 20, '2022-06-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (8, '口罩', '日用品', 'c', 50, '2022-07-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (9, '德芙', '食品', 'c', 120, '2022-08-05');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (10, '镜子', '日用品', 'c', 55, '2022-09-04');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (11, '卫龙', '食品', 'a', 8, '2022-10-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (12, '方便面', '食品', 'b', 5, '2022-11-01');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (13, '阿莫西林', '药品', 'b', 20, '2022-12-11');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (14, '青霉素', '药品', 'b', 20, '2022-03-11');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (15, '眼药水', '药品', 'c', 15, '2022-04-23');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (16, '桌子', '日用品', 'a', 150, '2022-05-15');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (17, '凳子', '日用品', 'b', 30, '2022-06-21');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (18, '笔', '日用品', 'c', 5, '2022-07-11');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (19, '热干面', '食品', 'a', 5, '2022-08-24');
INSERT INTO `test`.`pay_record` (`id`, `goods_name`, `goods_type`, `user_name`, `pay_money`, `pay_time`) VALUES (20, '水壶', '日用品', 'b', 50, '2022-09-27');
+----+--------------------+------------+-----------+-----------+------------+
| id | goods_name | goods_type | user_name | pay_money | pay_time |
+----+--------------------+------------+-----------+-----------+------------+
| 1 | 可比克 | 食品 | a | 10 | 2022-01-01 |
| 2 | 乐事 | 食品 | b | 15 | 2022-01-01 |
| 3 | 布洛芬 | 药品 | a | 50 | 2022-02-11 |
| 4 | 999感冒灵 | 药品 | b | 20 | 2022-03-01 |
| 5 | 连花清瘟胶囊 | 药品 | c | 100 | 2022-04-03 |
| 6 | 扫把 | 日用品 | b | 10 | 2022-05-05 |
| 7 | 拖把 | 日用品 | b | 20 | 2022-06-01 |
| 8 | 口罩 | 日用品 | c | 50 | 2022-07-01 |
| 9 | 德芙 | 食品 | c | 120 | 2022-08-05 |
| 10 | 镜子 | 日用品 | c | 55 | 2022-09-04 |
| 11 | 卫龙 | 食品 | a | 8 | 2022-10-01 |
| 12 | 方便面 | 食品 | b | 5 | 2022-11-01 |
| 13 | 阿莫西林 | 药品 | b | 20 | 2022-12-11 |
| 14 | 青霉素 | 药品 | b | 20 | 2022-03-11 |
| 15 | 眼药水 | 药品 | c | 15 | 2022-04-23 |
| 16 | 桌子 | 日用品 | a | 150 | 2022-05-15 |
| 17 | 凳子 | 日用品 | b | 30 | 2022-06-21 |
| 18 | 笔 | 日用品 | c | 5 | 2022-07-11 |
| 19 | 热干面 | 食品 | a | 5 | 2022-08-24 |
| 20 | 水壶 | 日用品 | b | 50 | 2022-09-27 |
+----+--------------------+------------+-----------+-----------+------------+
20 rows in set (0.02 sec)
1.计算每个用户在各类商品的支付金额和所有支付金额
聚合窗口函数我们使用sum()
来说明如何使用
SELECT# 利用OVER(partition by) 子句按照用户名分区 计算总金额* , SUM(sum_type_money) over(partition by user_name) as sum_money
FROM# 首先查询出每个用户在各类商品的支付金额 ( SELECT user_name, goods_type, sum( pay_money ) sum_type_money FROM pay_record GROUP BY user_name, goods_type ORDER BY user_name ) a;+-----------+------------+----------------+-----------+
| user_name | goods_type | sum_type_money | sum_money |
+-----------+------------+----------------+-----------+
| a | 日用品 | 150 | 223 |
| a | 药品 | 50 | 223 |
| a | 食品 | 23 | 223 |
| b | 日用品 | 110 | 190 |
| b | 药品 | 60 | 190 |
| b | 食品 | 20 | 190 |
| c | 日用品 | 110 | 345 |
| c | 药品 | 115 | 345 |
| c | 食品 | 120 | 345 |
+-----------+------------+----------------+-----------+
9 rows in set (0.01 sec)
2.计算每个用户购买日用品花费的金额及排名(升序排列)
SELECTuser_name,sum( pay_money ),# 行号ROW_NUMBER() over ( group_goods_type_order_sum_type_money ) AS money_row_number,# 排名 有相同名次的情况 会跳数字RANK() over ( group_goods_type_order_sum_type_money ) AS money_rank,# 排名 有相同名次的情况 不会跳数字DENSE_RANK() over ( group_goods_type_order_sum_type_money ) AS money_dense_rank,# 排名 百分比排名 返回分区内小于当前行值的百分比 (rank - 1) / (rows - 1)PERCENT_RANK() over ( group_goods_type_order_sum_type_money ) AS money_percent_rank
FROMpay_record
WHEREgoods_type = '日用品' GROUP BY# WINDOW 定义 命名窗口 上面有重复使用的时候 可以直接引用user_name WINDOW group_goods_type_order_sum_type_money AS (PARTITION BY goods_type ORDER BYsum( pay_money ));+-----------+------------------+------------------+------------+------------------+--------------------+
| user_name | sum( pay_money ) | money_row_number | money_rank | money_dense_rank | money_percent_rank |
+-----------+------------------+------------------+------------+------------------+--------------------+
| b | 110 | 1 | 1 | 1 | 0 |
| c | 110 | 2 | 1 | 1 | 0 |
| a | 150 | 3 | 3 | 2 | 1 |
+-----------+------------------+------------------+------------+------------------+--------------------+
3 rows in set (0.01 sec)
3.查询支付金额排名 占前 30% 的购买记录
SELECT*
FROM# 把整个分区当做一个组去分成 10 份( SELECT *, NTILE( 10 ) over ( ORDER BY pay_money DESC ) LEVEL FROM pay_record ) a
WHERELEVEL <= 3+----+--------------------+------------+-----------+-----------+------------+-------+
| id | goods_name | goods_type | user_name | pay_money | pay_time | LEVEL |
+----+--------------------+------------+-----------+-----------+------------+-------+
| 16 | 桌子 | 日用品 | a | 150 | 2022-05-15 | 1 |
| 9 | 德芙 | 食品 | c | 120 | 2022-08-05 | 1 |
| 5 | 连花清瘟胶囊 | 药品 | c | 100 | 2022-04-03 | 2 |
| 10 | 镜子 | 日用品 | c | 55 | 2022-09-04 | 2 |
| 3 | 布洛芬 | 药品 | a | 50 | 2022-02-11 | 3 |
| 8 | 口罩 | 日用品 | c | 50 | 2022-07-01 | 3 |
+----+--------------------+------------+-----------+-----------+------------+-------+
6 rows in set (0.00 sec)
4.查询a用户 第二次后面的商品次数、第一次购买商品的时间,及最后一次购买商品的时间
SELECTpay_time,# 窗口内的第2行数据NTH_VALUE( pay_time, 2 ) over ( ORDER BY pay_time rows BETWEEN unbounded preceding AND unbounded following ) twoRow,# 窗口内的第一行数据FIRST_VALUE( pay_time ) over ( ORDER BY pay_time rows BETWEEN unbounded preceding AND unbounded following ) firstRow,# 窗口内的最后一行数据LAST_VALUE( pay_time ) over ( ORDER BY pay_time rows BETWEEN unbounded preceding AND unbounded following ) lastRow
FROMpay_record
WHEREuser_name = 'a'+------------+------------+------------+------------+
| pay_time | twoRow | firstRow | lastRow |
+------------+------------+------------+------------+
| 2022-01-01 | 2022-02-11 | 2022-01-01 | 2022-10-01 |
| 2022-02-11 | 2022-02-11 | 2022-01-01 | 2022-10-01 |
| 2022-05-15 | 2022-02-11 | 2022-01-01 | 2022-10-01 |
| 2022-08-24 | 2022-02-11 | 2022-01-01 | 2022-10-01 |
| 2022-10-01 | 2022-02-11 | 2022-01-01 | 2022-10-01 |
+------------+------------+------------+------------+
# 5.查询两次购买时间间隔最长的天数用户
SELECT*,DATEDIFF( pay_time, following_pay_time ) paytime_diff,RANK() over ( ORDER BY DATEDIFF( pay_time, following_pay_time ) DESC ) paytime_diff_rank
FROM(SELECTuser_name,pay_time,# 分区内当前行的下一行数据lead( pay_time, 1 ) over ( PARTITION BY user_name ORDER BY pay_time desc ) following_pay_time, # 分区内当前行的上一行数据lag( pay_time, 1 ) over ( PARTITION BY user_name ORDER BY pay_time desc) preceding_pay_time FROMpay_record ) a limit 1+-----------+------------+--------------------+--------------------+--------------+-------------------+
| user_name | pay_time | following_pay_time | preceding_pay_time | paytime_diff | paytime_diff_rank |
+-----------+------------+--------------------+--------------------+--------------+-------------------+
| a | 2022-08-24 | 2022-05-15 | 2022-10-01 | 101 | 1 |
+-----------+------------+--------------------+--------------------+--------------+-------------------+
1 row in set (0.00 sec)
相关文章:
MySQL-窗口函数
窗口函数概念常用窗口函数聚合窗口函数专用窗口函数语法OVER子句window_specwindow_name (命名窗口)partition_clause 分区order_clause 排序frame_clause 范围 (指定窗口大小)使用限制练习准备概念 窗口函数对一组查询执行类似于聚合的操作。然而&#…...

【C++设计模式】学习笔记(1):面向对象设计原则
目录 简介面向对象设计原则(1)依赖倒置原则(DIP)(2)开放封闭原则(OCP)(3)单一职责原则(SRP)(4)Liskov替换原则(LSP)(5)接口隔离原则(ISP)(6)优先使用对象组合,而不是类继承(7)封装变化点(8)针对接口编程,而不是针对实现编程结语简介 Hello! 非常感谢您阅读海…...

[测开篇]设计测试用例的方法如何正确描述Bug
文章目录为什么测试人员要写测试用例?怎样设计测试用例?(总的方面)1.基于需求设计测试用例(总的方面) 2.页面(总的方面) 3.非功能性测试(具体方面) 4.1 等…...
设计模式学习笔记--单例、建造者、适配器、装饰、外观、组合
以下内容根据以下网址及相关视频整理:Android设计模式之单例模式_谬谬清不给我取名字的博客-CSDN博客_android 单例模式 Android设计模式--单例模式的六种实现和单例模式讲解Volatile与Synchronized相关的并发_龙腾腾的博客-CSDN博客_android 单例 volatile java …...
English Learning - Day5 L1考前复习 2023.2.10 周五
English Learning - Day5 L1考前复习 2023.2.10 周五1 单选题:She has the face _________.2 单选题: The goals ________ he fought all his life no longer seemed important to him.3 单选题:Sales director is a position ______ communi…...
C. Prepend and Append
time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Timur initially had a binary string†† s� (possibly of length 00). He performed the following operation several (possibly zero)…...

javassm超市在线配送管理系统
为了解决用户便捷地在网上购物,本文设计和开发了一个超市管理系统。本系统是基于web架构设计,SSM框架 ,使用Mysql数据库管理,综合采用JSP模式来完成系统的相关功能。主要实现了管理员与用户的注册与登陆,个人中心、用户…...
Scratch少儿编程案例-多模式贪吃蛇(无尽和计时)
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

谷歌蜘蛛池怎么搭建?Google蜘蛛池可以帮助谷歌排名吗?
本文主要分享关于谷歌蜘蛛池的搭建疑问,以及Google对谷歌排名的影响到底有多大。 本文由光算创作,有可能会被剽窃和修改,我们佛系对待这种行为吧。 谷歌蜘蛛池怎么搭建? 答案是:需要一个内链外链体系复杂的站群系统…...

Kubernetes集群-部署Java项目
Kubernetes集群-部署Java项目(SSG) k8s部署项目java流程图 第一步 打包制作镜像 打包 java源码: application.properties #在有pom.xml的路径下执行 mvn clean package制作镜像: 将刚才打包后的文件夹传到,装有dock…...
English Learning - Day54 作业打卡 2023.2.8 周三
English Learning - Day54 作业打卡 2023.2.8 周三引言1. 就算你不喜欢喝酒,也请尝一杯吧。2. 便纵有千种风情,更与何人说?——柳永《雨霖铃》 (来,挑战一下古诗词)3. 虽然忙,我也要参加会议。4. 无论发生什么…...
【Unity题】 1.矩阵旋转,欧拉旋转,四元数旋转各自的优缺点。2.StringBuilder和String的区别
1.矩阵旋转,欧拉旋转,四元数旋转各自的优缺点 矩阵旋转,欧拉旋转,四元数旋转是三种不同的旋转表示方法,下面是它们各自的优缺点: 矩阵旋转: 优点: 1.可以方便地实现复合旋转&…...

【C++面试问答】搞清楚深拷贝与浅拷贝的区别
问题 深拷贝和浅拷贝的区别是面试中的常见问题之一,对于不同的编程语言,这个问题的回答可能稍有差别,下面我们就来探索一下它们之间的异同吧。 先来看看在JavaScript对象的深拷贝与浅拷贝的区别: 浅拷贝:只是复制了…...

day10_面向对象基础
今日内容 零、 复习昨日 一、面向对象的概念 二、面向对象编程 三、内存图 零、 复习昨日 见晨考题 每日一数组题 写一个方法 用于合并两个int类型的数组 合并法则如下 {1,2,5,8,9}{1,3,0}---->{1,2,5,8,9,1,3,0} package com.qf.array;import java.util.Arrays;/*** --- 天…...

电影订票网站的设计与开发
技术:Java、JSP等摘要:随着科技的发展,时代的进步,互联网已经成为了人们生活中不可缺少的一部分,网上购物已然是一种时代的象征。纵观市场,电影行业的发展尤为迅速,电影种类和数量的增多导致客流…...

seata【SAGA模式】代码实践(细节未必完全符合saga的配置,仅参考)
seata SAGA模式: 代码仍然是上一篇AT模式的代码:AT模式 不需要undo_log表 下面开始: 首先,saga模式依靠状态机的json文件来执行整个流程,其中的开始节点的服务即TM,然后状态机需要依靠三张表࿰…...

面试题:Java锁机制
java对象包含了三个部分:对象头,实例数据和对齐填充。对象头又存放了:markWord和class point。classpoint :指向方法区,当前对象的类信息数据。markword:存储了很多和当前对象运行时的数据:例如…...

Springboot Web开发
文章目录一. 静态资源访问1. 配置静态资源访问前缀2. 修改默认静态资源存放目录3. Webjars4. 欢迎页支持5. 自定义Favicon二. 请求处理1. 路径变量2. 请求头处理3. 查询字符串处理4. 获取Cookie的值5. 获取请求体的值6. 获取请求域中的数据7. 矩阵变量一. 静态资源访问 只要静…...

分布式事务 | 使用DTM 的Saga 模式
DTM 简介前面章节提及的MassTransit、dotnetcore/CAP都提供了分布式事务的处理能力,但也仅局限于Saga和本地消息表模式的实现。那有没有一个独立的分布式事务解决方案,涵盖多种分布式事务处理模式,如Saga、TCC、XA模式等。有,目前…...

错误代码0xc0000001要怎么解决?如何修复错误
出现错误代码0xc0000001这个要怎么解决?其实这个的蓝屏问题还是非常的简单的,有多种方法可以实现 解决方法一 1、首先使用电脑系统自带的修复功能,首先长按开机键强制电脑关机。 注:如果有重要的资料请先提前备份好,…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...