【MySQL】聚合函数、group by、update、delete

news2024/11/15 12:10:51

聚合函数、group by、update、delete

  • 前言
  • 正式开始
    • update
      • 将孙悟空同学的数学成绩变更为 80 分
      • 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
      • 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
      • 将所有同学的语文成绩更新为原来的 2 倍
    • delete
      • 删除孙悟空同学的考试成绩
      • 删除整张表数据
        • 截断表
    • 插入查询结果
    • 聚合函数
      • 统计班级共有多少同学
      • 统计数学成绩有多少个
      • 统计数学总成绩
      • 统计英语不及格的人的英语平均分
      • 总成绩平均分
    • 分组查询
      • 显示每个部门的每种岗位的平均工资和最低工资
      • 显示平均工资低于2000的部门和它的平均工资
    • 一些oj题目
      • 题目
      • 答案

在这里插入图片描述

前言

续着上一篇来,上一篇主要讲了insert和select,本篇很多知识都会涉及到select,如果你对于select不太熟悉,建议先看看我上一篇:【MySQL】insert和select单表查询详解

本篇重点讲解group by和聚合函数,update和delete一带而过。

正式开始

把最简单的先搞了,先来说update和delete。

还是和上一篇一样的exam_result表:
在这里插入图片描述

update

语法:

update 表名 set 列名=表达式或值(如果有多列用逗号分隔) [where ...] [order by ...] [limit ...]; # 一般搭配where、order by、limit使用

注意update操作和等会要讲的delete操作都是非常危险的操作,用的时候一定要谨慎。一不小心可能数据就都被干没了。

上例子。

将孙悟空同学的数学成绩变更为 80 分

题目要求将孙悟空同学的数学改为80,如果我用下面这条语句:
在这里插入图片描述

就会一下子把所有人的数学都干成80,所以说update是很危险的,一般都要搭配着where来使用:

在这里插入图片描述

将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

要求是曹孟德同学,所以还是要用到where:
在这里插入图片描述

将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

倒数,要用到排序;前三,要用到limit,先搞出来(这些我上一篇都讲了,不懂得同学可以去前一篇看看):
在这里插入图片描述

上面用的是select,不过我们要进行更新,给它改成update,并将数学增加30:
在这里插入图片描述

成功。

注意MySQL中不支持+=,所以上面不能让math+=30,是错误的。

将所有同学的语文成绩更新为原来的 2 倍

这个其实比上面的简单:
在这里插入图片描述

看到没,没有加筛选条件就会将所有人的数据都修改掉。

更新就讲到到这,比较简单,下面说说delete。

delete

用delete前再强调一下,不要随便用,很危险。

语法:

delete from 表名 [where ...] [order by ...] [limit ...];

删除孙悟空同学的考试成绩

很简单,删除孙悟空的,要搭配where:
在这里插入图片描述

注意,如果没有加上后面的where …就会直接将整张表的数据删掉,很危险,不要随便用delete。

删除整张表数据

演示一下这个。

其实删除整张表可以是直接将整个表删除(表结构和表中的数据都删),还可以是只删表数据。
连着表结构删的是drop table,只删数据的是delete。

这里我专门搞一个表用来删除:

CREATE TABLE for_delete (
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(20)
);

desc:
在这里插入图片描述

我前面讲过auto_crement,这里id就是自增列。定义表结构的时候没有说auto_increment的值是多少,所以会默认从1开始,不过默认从1开始用show的时候不会显示:

在这里插入图片描述
本来应该是在存储引擎后面显示的,先不管了,等会就看到了。

然后插入点数据:

INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');

在这里插入图片描述

看一下现在的自增值为多少:
在这里插入图片描述

删除整张表:
在这里插入图片描述

这样整张表的数据就都没了:
在这里插入图片描述

再来看自增值为多少:
在这里插入图片描述
还是4,所以说delete整张表的数据不会让自增值重置。

再来插入一个值:
在这里插入图片描述
这里id是4,正确的。

再来看一下show:
在这里插入图片描述
自增值为5,正常。

截断表

截断表其实就是删除表中的数据,用的是truncate不过这里和delete有点不一样。

语法:

truncate [table] 表名;

用起来很简单。

建一张专门用来截断的表:

CREATE TABLE for_truncate (
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(20)
);

desc:
在这里插入图片描述

show一下:
在这里插入图片描述

这里也是id为自增列,默认从1开始,没有显示。

插入点数据:

INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C');

在这里插入图片描述

show一下:

此时我用truncate将所有的值删掉:
在这里插入图片描述

show一下:
在这里插入图片描述

自增值没有了,再插入一个看看:
在这里插入图片描述

新插入的值id为1。

这里也就是说truncate会将自增值归零。

这就是truncate和delete的区别之一。

注意:这个操作慎用

简单总结一下truncate:

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上truncate不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项

因为我还没写与事务相关的博客,这里就简单解释一下第二条。

我前面博客所讲的所有sql语句(包括刚刚的delete),都要经过事务包装,而truncate不会。MySQL会对我们曾经所做过的操作做记录,保存在日志中,比较重要的日志有:bin log、redo log和undo log,我们平时的操作就保存在bin log和redo log中,bin log是用来保存历史sql语句的,redo log和崩溃安全有关(比如说断电的时候内存中有数据还没有刷新到磁盘中)。而truncate操作不会将记录保存在日志中,只是单纯将数据清空,这样就会更快一些,所以truncate不能进行数据回滚。

插入查询结果

insert的时候也可以搭配select使用。语法如下:

INSERT INTO table_name [(column [, column ...])] SELECT ...

来个能用到这个的问题:删除表中的重复记录,让重复的记录只留下一份。

先来搞一个有重复数据的表:
在这里插入图片描述
select:
在这里插入图片描述

去掉重复的,可能有的同学会想到我上一篇讲过的distinct:
在这里插入图片描述

但是这里并不会对原表中的数据进行删除,而是仅仅将数据去重后显示出来,原表中的数据还是不变的。得要删除掉重复的。

简单说一下思路:
再创建一张新表,然后通过insert和select配合着来,将去重后的数据插入到新表中。然后将这两个表名字改一下就行。

实现一下,先来建一张和duplicate_table结构一样的新表,可以直接用like就能创建一个结构一样的:
在这里插入图片描述

然后再搭配insert和select来讲去重后的数据放到新建的表中:
在这里插入图片描述
非常的成功。

前面博客也讲过建表就是在配置文件中数据目录(我的是/var/lib/mysql,演示用的库名称是my_test)下创建一个文件:
在这里插入图片描述
红框圈起来的就是刚刚的两张表,这里我直接对表名做一下修改,就能得到一张去重后的表:
在这里插入图片描述
这样就去重成功了。

其实上面两个重命名可以放到一块写,用逗号分隔就可以:
在这里插入图片描述

对应目录下的文件名字也会修改:
在这里插入图片描述

为啥要重新建一张表这样搞呢?
通过重命名表来实现原子的去重操作。

因为建表就是建一个文件,我们如果要在特定目录下上传一个文件,最好的操作是先在一个临时目录下上传这个文件,等临时目录下上传好了之后再将这个文件通过mv指令转移到特定目录下。

因为上传文件的过程不是原子的,上传就是在对文件进行写入,假如上传内容比较多,比如说1G,那么上传的时间就会比较长,如果你直接在特定目录下上传,可能会有其他用户会访问这个文件,如果对这个文件做了修改那就不好了。所以不要直接在特定目录下上传文件,在一个临时目录下上传好了,然后直接将上传好的文件mv到特定目录下,这样操作就是原子的,不可能说mv的时候会有其他用户会访问,mv之后再访问的文件一定是上传好的文件。

所以这里的rename也是同理的。为的就是原子性。

聚合函数

下面说的这些函数都是为了等会要讲的分组查询做准备的,这些函数以记录为单位,为我们进行聚合统计:

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

根据函数名字就能知道意思的,我就介绍了,直接给例子。

还是这张表:
在这里插入图片描述

统计班级共有多少同学

统计:
在这里插入图片描述

这里*还可以换成id:
在这里插入图片描述

甚至还可以换成数字1:
在这里插入图片描述

几都行:
在这里插入图片描述

因为select xxx from这个表都会补齐同样的行数:
在这里插入图片描述

统计数学成绩有多少个

很简单,和上面的一样:
在这里插入图片描述

不过这里数学是有重复的:
在这里插入图片描述

count这里能不能用distinct去重呢?
在这里插入图片描述
貌似不行,但是注意这里的distinct是在对count去重,我想要的效果是对math去重:
在这里插入图片描述

distinct加载外边,是先对所有的数据做聚合,聚合之后就只有一个6了,所以咋去重都是一个6,。

统计数学总成绩

很简单,用sum就行:
在这里插入图片描述

如果想要求数学的平均成绩可以:
在这里插入图片描述

不过这样反而麻烦了,有avg函数:
在这里插入图片描述

统计英语不及格的人的英语平均分

先搞出来英语不及格的人:
在这里插入图片描述

看一下都是谁:
在这里插入图片描述

然后求平均分:
在这里插入图片描述

这里avg前面能加name吗?
在这里插入图片描述
不行,name和avg搭配不上,name列中的各个记录和avg是没有关系的,想要聚合得有聚合条件才行,一个只属于某个人的属性信息是无法和聚合信息相结合的。就比如说这里的唐三藏和平均成绩搭配起来没有意义。

总成绩平均分

在这里插入图片描述

很简单,不细说了。

分组查询

首先,记住一点,分组查询的目的是为了分组之后方便进行聚合统计。

举个例子,班里有男有女,可以根据姓名分组,然后再对分完组的数据进行聚合统计,那这里就可以是所有男生的平均分和所有女生的平均分。

语法:

select column1, column2, .. from table group by column;

group by前面的所有sql语句都是前面讲的那些,比如还可以加where什么的。

语法上会先用select对数据进行挑选,然后再根据挑选的结果用group by进行分组。

这里我用一个备份好的数据库(这个文件在本篇开头也给了):
在这里插入图片描述
关于数据库备份和恢复的话题我前面也讲过,不懂的同学看这篇:【MySQL】库的相关操作 + 库的备份和还原。

先简单看一下里面的内容(三张表,雇员、部门、薪资):

/*数据库的一个备份文件*/
DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `scott`;

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
  `dname` varchar(14) DEFAULT NULL COMMENT '部门名称',
  `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);


DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);


DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `grade` int(11) DEFAULT NULL COMMENT '等级',
  `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
  `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);


insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

仔细看的话可以看出来其中没有明着设置什么主键外键的,但是有主键外键的体现,比如说雇员表中有一列为部门编号,其实就是这个表中的外键,但是没有明着实现。一般有些公司会为了效率而不在数据库中设置这些键,但是会在上层连接的语言实现这些键的约束,比如说java连接好数据库后就用java来实现上层逻辑上的约束。

直接用source还原这个库(我这里把这个文件放到了/home/yjy/MySQL这个路径下了):
在这里插入图片描述

恢复好后就会有个数据库名字叫scott:
在这里插入图片描述

里面三张表:
在这里插入图片描述

select显示一下,dept:
在这里插入图片描述

emp:
在这里插入图片描述
salgrade:
在这里插入图片描述

等会主要是用emp这张表来演示分组查询。

如何显示每个部门的平均薪资和最高薪资?
所有员工的信息都放在emp表中,每个员工也都有其所属部门,通过部门号就可以区分出来不同部门的平均薪资和最高薪资。

再来看一下这张雇员表;
在这里插入图片描述

通过部门号来进行分组:
在这里插入图片描述
可以看到部门分了3组,10、20、30,不过前面仔细观察了的话,其实部门的那张表中是有4个部门的,也就是说这里有一个部门是没有雇员的,专门是一个空的部门,其实现实生活中也存在这样的情况。

不过区分部门前先来搞出所有的平均薪资和最高薪资:
在这里插入图片描述

然后把两个拼到一块:
在这里插入图片描述

加上部门号显示出来:
在这里插入图片描述

为什么这里能把的deptno放在前面呢?
因为放到这里有意义,deptno放到前面就能表示哪一个部门的平均薪资和最高薪资。不过等会再细说。

这就是分组统计。

强调一下,group by要结合需求,要明白group by的作用是让我们进行分组聚合统计的,group by要指定列来进行分组,但是实际上分组是用该列中不同的行数据来进行分组的。

分组的条件(刚刚的例子中就是deptno),每个组的组内记录一定是相同的。像这里的deptno,deptno为10的组中记录的deptno都是10,这样一组就可以被聚合压缩,因为大家都一样。

所以分组就是把一组按照条件拆成了多个组,各组内再进行统计。再说的直白一点,分组就是把一张表按照条件在逻辑上拆成了多个子表,然后分别对各自的子表进行聚合统计。

显示每个部门的每种岗位的平均工资和最低工资

看条件,每个部门的每种岗位。这就一下子分了两次。每个部门中都有不同的岗位,不同的岗位又会对应不同的工资,分组就是这样:
在这里插入图片描述

先来分组看看:
在这里插入图片描述

这里3个部门都是各自3个职位,再统计不同岗位的平均工资和最低工资:
在这里插入图片描述

上面的分组的那张图就像树一样,组分的越细,叶子结点越多,同时显示的条数也就会越多,分组其实就是在不断分表。

这里我再加上ename(员工名称):
在这里插入图片描述
报错。enmae没有进行分组,不属于分组的条件,无法进行压缩聚合,刚刚画的图中第二层分组的部门号一定相同,第三层是对第二层再分组,第三层的岗位相同的同时部门号也一定相同,刚刚给加上了名字后会报错,因为名字都是不同的,没法聚合。

一般之后在group by中出现的具体列名才可以在select后面出现,比如刚刚的deptno和job:
在这里插入图片描述

还有能出现的就是聚合函数,除此之外,一般其他列不能再select后面出现。

比如我只拿岗位来分组:
在这里插入图片描述
此时如果再加上部门就会报错:
在这里插入图片描述
因为这样分组意义是不通的。

我甚至可以用名字来分组,只不过这里分组分出来的都和原本的数据是一样的:
在这里插入图片描述

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

首先先把部门分出来:
在这里插入图片描述

它还要平均工资:
在这里插入图片描述
很明显,还有个要求,平均工资小于2000,能用where吗?
在这里插入图片描述
错了。

因为这里sql执行的时候是有顺序的,前一篇中我讲过的执行顺序有:
from -> where -> select -> order by -> limit。

这里就不卖关子了,直接给出整体顺序:
from --> where --> group by --> 聚合 --> having --> select --> distinct-- > order by–> limit

其中where都在聚合之前了,肯定没法将平均后的组进行筛选。那什么能筛选呢?
上面的执行顺序中有一个having,就用这个。
在这里插入图片描述

这里是先统计处各部门的平均工资,然后再对统计结果进行筛选。也就是先将结果聚合出来再对聚合的结果进行判断。having在聚合后面执行,所以可以用重命名:
在这里插入图片描述

注意having一般搭配聚合函数来使用,having是对聚合后的统计数据进行条件筛选。

那么having和where的区别有啥呢?
先来用where替换意向刚刚的having:
在这里插入图片描述
失败。

再用having来试一下where的工作,比如说查SMITH的信息:
在这里插入图片描述
可以。

having本来就是用来查询的,前面说having一般配合聚合函数用,而聚合函数又配合group by用,group就是在分组;前面还说可以把分组看成分表,那么当表没有被分的时候也可以看成是一个完整的组,having自然也就能用了。

但是不推荐用having来替代where。

再来对刚刚的要求做一下修改,再来加一个约束:
除了SMITH以外,显示工资低于2000的部门的平均工资。

首先要排除SMITH,用where来排除:
在这里插入图片描述
原来第一行的SMITH没了。

这里查出来的也算是一张表,不要认为无条件查询出来的表才是一张表,只要是查出来的就是表。不是说只有在磁盘上真实存在的表结构才是表,中间筛选出来的包括最终结果都是逻辑上的表。“MySQL”一切皆表,这句话不是官方的话,我们只要能处理好单表的CRUD,所有的sql场景,我们全部都能用同一的方式进行处理,至于是什么方式后面多表查询的时候再说。

然后剩下的就和前面的条件一样了:
在这里插入图片描述

where是对具体的任意列进行条件筛选,having是对分组聚合之后的结果进行条件筛选,二者的应用场景是完全不同的,所以这条SQL的执行顺序是:

  1. 先去哪张表中拿数据(from)
  2. 拿数据时筛选条件是什么(where)
  3. 筛选之后再根据组合工作岗位进行分组(group by)
  4. 按照分完组后的结果进行聚合统计以及重命名
  5. 对结果进行筛选(having)

那么二者的区别在于筛选的阶段是不通的。

一些oj题目

那么该讲的都讲了,下面给出一些oj题,感兴趣的老铁自己练一练,先把题目给出类,答案放在最后。

题目

  1. SQL228 批量插入数据

  2. SQL202 找出所有员工当前薪水salary情况

  3. 查找最晚入职员工的所有信息

  4. SQL196 查找入职员工时间排名倒数第三的员工所有信息

  5. SQL201 查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

  6. 从titles表获取按照title进行分组

  7. 182. 查找重复的电子邮箱

  8. 595. 大的国家

答案

  1. SQL228 批量插入数据
insert into actor values 
(1, 'PENELOPE', 'GUINESS','2006-02-15 12:34:33'),
(2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33');
  1. SQL202 找出所有员工当前薪水salary情况
select distinct salary from salaries order by salary desc;
  1. 查找最晚入职员工的所有信息
select * from employees order by hire_date desc limit 1;
  1. SQL196 查找入职员工时间排名倒数第三的员工所有信息
select * from employees where hire_date=(
    select distinct hire_date from employees order by hire_date desc limit 2,1
);
  1. SQL201 查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t
select emp_no,count(emp_no) t from salaries group by emp_no having t > 15;
  1. 从titles表获取按照title进行分组
select title, count(title) t 
from titles 
group by title 
having t > 2;
  1. 查找重复的电子邮箱
select Email from Person group by Email having count(Email) > 1;
select name,population,area from World where population >= 25000000 or area >= 3000000;

我就不细讲了。

到此结束。。。

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

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

相关文章

【miniQMT实盘量化4】获取实时行情数据

前言 上篇,我们介绍了如何获取历史数据,有了历史数据,我们可以进行分析和回测。但,下一步,我们更需要的是实时数据,只有能有效的监控实时行情数据,才能让我们变成市场上的“千里眼,…

手机照片误删解决方法分享

几个要点 1.检查回收站:一些情况下,我们会在删除文件时将它们移动到回收站中,查看回收站中是否有被删除的照片,这样可以直接恢复文件。 2.使用手机自带的恢复功能:一些手机自带照片恢复功能,可尝试在相册…

Sentinel 热点规则 (ParamFlowRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

二分查找——34. 在排序数组中查找元素的第一个和最后一个位置

文章目录 1. 题目2. 算法原理2.1 暴力解法2.2 二分查找左端点查找右端点查找 3. 代码实现4. 二分模板 1. 题目 题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 给你一个按照非递减顺序排列的整数数组 nums&#…

【单片机】实验:数码管显示实验

STC89C5xRC #include <STC89C5xRC.H> unsigned char value[22] {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,P,U,T,Y,L,H};//可显示内容 unsigned char led[22] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3E,0x31,0x6E,0x38,0x7…

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层 前言 在 Python 的logging模块中&#xff0c;它不仅提供了基础的日志功能&#xff0c;还拥有一系列高级配置选项来满足复杂应用的日志管理需求。 说到logging 模块的高级配置&#xff0c;必须提及日志分…

【代码随想录】刷题笔记Day32

前言 实在不想做项目&#xff0c;周末和npy聊了就业的焦虑&#xff0c;今天多花点时间刷题&#xff01;刷刷刷刷&#xff01; 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 分割startindex类似上一题&#xff0c;难点在于&#xff1a;判断子串合法性(0~255)、&…

C语言之sizeof 和 strlen 详细介绍

C语言之sizeof 和 strlen 文章目录 C语言之sizeof 和 strlen1. sizeof 和 strlen 的比较1.1 sizeof1.2 strlen1.3 sizeof 和 strlen 的对比 2. 练习2.1.1 一维数组2.1.2 字符数组 1. sizeof 和 strlen 的比较 1.1 sizeof sizeof是C语言中的一个关键字&#xff0c;计算的是变量…

国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Go…

【前端学java】语法练习-工具类的封装(13)

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学 java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08…

leetcode:504. 七进制数

一、题目&#xff1a; 链接&#xff1a; 504. 七进制数 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; char* convertToBase7(int num) 二、思路 本题要将十进制数转换为二进制数&#xff0c;只要将十进制num数模7再除7&#xff0c;直到num等于0 每次将模7的结…

国际物流社交销售玩法拆解(三):打造社交电商式分销增长

这一篇&#xff0c;是国际物流行业社交销售玩法最后一篇&#xff0c;也是国际物流企业实现业务经营新增长、打造分销增长体系的新模式。以下&#xff0c;我们一起来拆解这一模式具体内容吧。 #01 国际物流第二曲线&#xff1a;社交电商 经营增长是企业的永恒话题。在客户成本…

【数据结构】树与二叉树(廿一):树和森林的遍历——先根遍历(递归算法PreOrder、非递归算法NPO)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法5.3.3 树和森林的遍历1. 先根遍历&#xff08;递归&am…

【Web】Flask|Jinja2 SSTI

目录 ①[NISACTF 2022]is secret ②[HNCTF 2022 WEEK2]ez_SSTI ③[GDOUCTF 2023] ④[NCTF 2018]flask真香 ⑤[安洵杯 2020]Normal SSTI ⑥[HNCTF 2022 WEEK3]ssssti ⑦[MoeCTF 2021]地狱通讯 ①[NISACTF 2022]is secret dirsearch扫出/secret 明示get传一个secret ?…

【洛谷 P3743】kotori的设备 题解(二分答案+循环)

kotori的设备 题目背景 kotori 有 n n n 个可同时使用的设备。 题目描述 第 i i i 个设备每秒消耗 a i a_i ai​ 个单位能量。能量的使用是连续的&#xff0c;也就是说能量不是某时刻突然消耗的&#xff0c;而是匀速消耗。也就是说&#xff0c;对于任意实数&#xff0c;…

国家开放大学平时作业训练题

卷代号&#xff1a;1400 机器人技术及应用 参考试题 一、单项选择题&#xff08;每小题3分&#xff0c;共45分&#xff09; 1.在变径轮和变形车轮的设计中&#xff0c;借鉴了&#xff08; &#xff09;的设计&#xff0c;使得车轮可以主动变形进行越障。 A.滑块机构 …

王者荣耀游戏

游戏运行如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\D…

使用大语言模型 LLM 做文本分析

本文主要分享 传统聚类算法 LLM与嵌入算法 嵌入算法聚类 LLM的其他用法 聚类是一种无监督机器学习技术&#xff0c;旨在根据相似的数据点的特征将其分组在一起。使用聚类成簇&#xff0c;有助于解决各种问题&#xff0c;例如客户细分、异常检测和文本分类等。尽管传统的聚…

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)

文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前&#xff0c;我们在D…

【Linux】指令详解(一)

目录 1. 前言2. 与指令相关的知识2.1 文件2.2 路径 3. 常见指令3.1 pwd3.2 ls3.2.1 ls -l3.2.2 ls -la 3.3 mkdir3.4 cd3.5 clear3.6 touch 1. 前言 来学习一些Linux的指令和一些相关的知识。 第一步那肯定是打开自己的xshell。 这里可以修改字体和大小。 可以使用ctrl回车全…