MySQL表的增删改查(进阶)

目录

数据库约束

约束的定义

约束类型

null约束

unique:唯一约束

default:默认值约束

primary key:主键约束(重要)

foreign key:外键约束(描述两个表之间的关联)

表的设计

一般思路

三大范式

一对一

一对多

​编辑

多对多

​编辑

新增

查询

聚合查询

聚合函数

group by字句

having

联合查询(也称多表查询)

内连接

外连接

自连接

子查询

合并查询


数据库约束

约束的定义

定义:创建表时,给这个表制定一些规则,后续插入/修改/删除都要保证数据能够遵守这些规则.

引入约束的规则,是为了更强的数据检查/校验.数据一定要保证正确性.(如果后续插入/修改的数据不符合要求,就会报错)

执行效率(代码在机器上跑的快不快)

开发效率(程序员写代码所花费的时间)

我们讲约束也是牺牲了执行效率,换来了开发效率.因为开发效率更重要:因为人力成本高于机器硬件成本.

约束类型

共分为not null, unique, default, primary key, check这几种

null约束

定义:指示某列不能存储null值

在创建表时,就是指定某列不为空,当指定列插入null会报错

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT NOT NULL ,
  sn INT ,
  name VARCHAR ( 20 ),
  qq_mail VARCHAR ( 20 )
);

unique:唯一约束

定义:保证某列的每行必须有唯一的值.

指定sn为唯一的,不重复的(即在这一列都不会出现):

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT NOT NULL ,
  sn INT UNIQUE,
  name VARCHAR ( 20 ),
  qq_mail VARCHAR ( 20 )
);

default:默认值约束

定义:规定没有给列赋值时赋默认值.(默认情况下的默认值设置为null)

指定插入数据时,name列为空,默认值为unknown

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT NOT NULL ,
  sn INT UNIQUE,
  name VARCHAR ( 20 ) DEFAULT 'unkown' ,
  qq_mail VARCHAR ( 20 )
);

primary key:主键约束(重要)

定义:not null和unique的结合.确保某列(或两个列,多个列的组合)有唯一标识(就是一个记录的身份标识),有助于更容易更快速地找到表中的一个特定记录.(通常用xxx id作为主键,通常一个表中只有一个主键).

指定id列为主键:

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT NOT NULL PRIMARY KEY,
  sn INT UNIQUE,
  name VARCHAR ( 20 ) DEFAULT 'unkown' ,
  qq_mail VARCHAR ( 20 )
);
自增主键的介绍:auto_increment(对id(主键)的+1操作)
不需要用户自己指定(可以放个null),可交给数据库进行分配(1,2,3...)
其实,程序员可以自行设定id亦可
每次使用null方式插入自增主键时,都是数据库根据这一列的最大值,在这个基础上,继续递增,不会重复利用之前上述的自增主键,只能在当前单个数据库下生效
如果数据库是由多个mysql服务器构成集群时,自增主键就无效了
在实际业务当中,引入的主键是不希望重复的.
id INT PRTMARY KEY auto_increment,

foreign key:外键约束(描述两个表之间的关联)

定义:保证一个表中的数据匹配另一个表中的值的参照完整性.
外键用于关联其他表的主键或者唯一键,语法:
foreign key (字段名) references 主表(列)
-- 字段名是指本表的哪个列
-- 主表是指被关联的表
-- 列就是被关联的表的哪个列
注:外键约束是写到最后,把前面的定义好之后,在最后通过foreign key创建外键约束.
案例:
创建班级表classes,id为主键:
-- 创建班级表,有使用 MySQL 关键字作为字段时,需要使用 `` 来标识
DROP TABLE IF EXISTS classes;
CREATE TABLE classes (
        id INT PRIMARY KEY auto_increment,
        name VARCHAR ( 20 ),
        `desc` VARCHAR ( 100 )
);
设计要求:学生表中的class_id都在班级表中存在
创建学生表student,一个学生对应一个班级,一个班级对应多少学生.使用id为主键,classes_id为外键,关联班级表id
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY auto_increment,
  sn INT UNIQUE,
  name VARCHAR ( 20 ) DEFAULT 'unkown' ,
  qq_mail VARCHAR ( 20 ),
classes_id int ,
FOREIGN KEY (classes_id) REFERENCES classes(id)
); 

1.把约束别的表的表称为"父表".

   把被约束的表,称为"子表".

2.外键约束,也是双向的,要想删除父表的记录,就必须先删除子表中的相关数据,以确保子表中没有数据.

3.使用外键约束时,操作子表,要查询父表;操作父表,也要查询子表.子表和父表中被引用的列都要带有"索引".表里有了主键之后,就会自动创建出索引,加快查询速度

4.扩展知识:对电脑上的文件进行删除,也只是逻辑上的删除,不是真的删除.把文件删除掉,其实也是在系统中,把硬盘对应的盘块数据标记为无效了(所以不是真正意义上的删除) 

表的设计

一般思路

 1.先根据需求,找到实体(一些关键性质的对象),梳理清需求,提取出关键字的名字,一般来说,每个实体,都得安排个表.

2.梳理实体间的关系(不同关系下,有不同设计表的方式),造句,向里面套,能套上哪个,就用哪种方式创建数据表(定式)

三大范式

一对一

方案一:搞一个大表,把这些信息都放在一起(前提是这两个表都很简单(即列很少,可以考虑合并))

方案二:分两个表,使用id引用过来,建立联系(可用于表很复杂的情况) 

一对多

多对多

创建课程表

-- 创建课程表
DROP TABLE IF EXISTS course;
CREATE TABLE course (
  id INT PRIMARY KEY auto_increment,
  name VARCHAR ( 20 )
);

创建学生课程中间表,考试成绩表

-- 创建课程学生中间表:考试成绩表
DROP TABLE IF EXISTS score;
CREATE TABLE score (
  id INT PRIMARY KEY auto_increment,
  score DECIMAL ( 3 , 1 ),
  student_id int ,
  course_id int ,
  FOREIGN KEY (student_id) REFERENCES student(id),
  FOREIGN KEY (course_id) REFERENCES course(id)
);

新增

插入查询结果

语法(将插入语句和查询语句结合到一起了):

insert into table_name [(column [, column...])] select ... 

-- 查询结果的集合就代替了values

案例:创建一张用户表,设计有name姓名,email邮箱,sex性别,mobile手机号字段.需要把已有的学生数据复制进来,可以复制的字段有name, qq_mail.

-- 创建用户表
DROP TABLE IF EXISTS test_user;
CREATE TABLE test_user (
  id INT primary key auto_increment,
  name VARCHAR ( 20 ) comment ' 姓名 ' ,
  age INT comment ' 年龄 ' ,
  email VARCHAR ( 20 ) comment ' 邮箱 ' ,
sex varchar ( 1 ) comment ' 性别 ' ,
mobile varchar ( 20 ) comment ' 手机号 '
);
-- 将学生表中的所有数据复制到用户表
insert into test_user(name, email) select name, qq_mail from student;

查询

聚合查询

定义:就是"行和行"之间的运算,但此处行之间的运算具有一定限制,不像表达式查询(表达式查询是操作列).

聚合函数

使用聚合函数时,列和列之间,已经被"打散了",如果查询中包含聚合函数,和非聚合的列,各自是各自的.大部分情况,聚合的列和非聚合的列是不能混用的,一种情况除外(group by(后面讲))

函数说明
count([distinct] expr)返回查询到数据的数量
sum([distinct] expr)返回查询到的数据的总和,不是数字则没有意义
avg([distinct] expr)返回查询到数据的平均值,不是数字则没有意义
max([distinct] expr)返回查询到数据的最大值,不是数字则没有意义
min([distinct] expr)

返回查询到数据的最小值,不是数字则没有意义

案例:

count:

-- 统计班级共有多少同学
SELECT COUNT (*) FROM student;
SELECT COUNT ( 0 ) FROM student;
-- 统计班级收集的 qq_mail 有多少个, qq_mail NULL 的数据不会计入结果
SELECT COUNT (qq_mail) FROM student;
注意:当使用count(*) 时,即使是全为null的行,也会被记录次数
        当使用count(列名)时,如果中间有为null的行,则不会被记录次数

sum:

-- 统计数学成绩总分
SELECT SUM (math) FROM exam_result;
-- 不及格 < 60 的总分,没有结果,返回 NULL
SELECT SUM (math) FROM exam_result WHERE math < 60 ;
注意:
1.sum函数会将null自动忽略
2.sql很多时候会将字符串当作数字进行算术运算,都会将字符串转为数字
(eg.允许"100"转换为100)
avg:
-- 统计平均总分
SELECT AVG (chinese + math + english) 平均总分 FROM exam_result;

max:

-- 返回英语最高分

SELECT MAX (english) FROM exam_result;

min:

-- 返回 > 70 分以上的数学最低分
SELECT MIN (math) FROM exam_result WHERE math > 70 ;

group by字句

在select中使用group by可以对指定列进行分组查询.需要满足:使用group by进行分组查询时,select指定的字段必须是"分组依据字段", 其它字段如想出现在select中,必须包含在聚合函数中.

实际效果就是把这个指定的列,值相同的记录划分到一组,针对这些组就可以分别聚合查询了,分组操作,往往是和"聚合"配合使用的.

select column1, sum(column2), .. from table group by column1,column3;

 -- column1是分组依据

案例:

准备测试表及数据:职员表,有id(主键), name(姓名), role(角色), salary(薪水)

create table emp(
id int primary key auto_increment,
name varchar ( 20 ) not null ,
role varchar ( 20 ) not null ,
salary numeric ( 11 , 2 )
);
insert into emp(name, role, salary) values
( ' 马云 ' , ' 服务员 ' , 1000.20 ),
( ' 马化腾 ' , ' 游戏陪玩 ' , 2000.99 ),
( ' 孙悟空 ' , ' 游戏角色 ' , 999.11 ),
( ' 猪无能 ' , ' 游戏角色 ' , 333.5 ),
( ' 沙和尚 ' , ' 游戏角色 ' , 700.33 ),
( ' 隔壁老王 ' , ' 董事长 ' , 12000.66 );

查询每个角色的最高工资,最低工资和平均工资

select role,max(salary),min(salary),avg(salary) from emp group by role;

having

group字句进行分组之后,需要对分组结果再进行条件过滤时,不能使用where语句,而需要用having语句.(即分组之前的条件,使用where表示;分组之后的条件,使用having表示)

显示平均工资低于1500的角色和它的平均工资

select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)< 1500 ;

联合查询(也称多表查询)

所谓多表联合查询,核心操作为笛卡尔积,然后指定一些条件之类的,来实现需求中的一些查询结果.

实际开发中往往数据来自不同的表,所以需要多表联合查询.多表查询是对多张表的数据取笛卡尔积:

笛卡尔积列数为之前列数之和,行数为两个表的行数之积.

但实际上,笛卡尔积得到的结果,绝大部分是无效数据.

 注意:关联查询可以对关联表使用别名.

让我们来看一下下面的案例(可以尝试自己敲一下):

insert into classes(name, `desc`) values
( ' 计算机系 2019 1 ' , ' 学习了计算机原理、 C Java 语言、数据结构和算法 ' ),
( ' 中文系 2019 3 ' , ' 学习了中国传统文学 ' ),
( ' 自动化 2019 5 ' , ' 学习了机械自动化 ' );
insert into student(sn, name, qq_mail, classes_id) values
( '09982' , ' 黑旋风李逵 ' , 'xuanfeng@qq.com' , 1 ),
( '00835' , ' 菩提老祖 ' , null , 1 ),
( '00391' , ' 白素贞 ' , null , 1 ),
( '00031' , ' 许仙 ' , 'xuxian@qq.com' , 1 ),
( '00054' , ' 不想毕业 ' , null , 1 ),
( '51234' , ' 好好说话 ' , 'say@qq.com' , 2 ),
( '83223' , 'tellme' , null , 2 ),
( '09527' , ' 老外学中文 ' , 'foreigner@qq.com' , 2 );
);
insert into course(name) values
( 'Java' ),( ' 中国传统文化 ' ),( ' 计算机原理 ' ),( ' 语文 ' ),( ' 高阶数学 ' ),( ' 英文 ');
insert into score(score, student_id, course_id) values
-- 黑旋风李逵
( 70.5 , 1 , 1 ),( 98.5 , 1 , 3 ),( 33 , 1 , 5 ),( 98 , 1 , 6 ),
-- 菩提老祖
( 60 , 2 , 1 ),( 59.5 , 2 , 5 ),
-- 白素贞
( 33 , 3 , 1 ),( 68 , 3 , 3 ),( 99 , 3 , 5 ),
-- 许仙
( 67 , 4 , 1 ),( 23 , 4 , 3 ),( 56 , 4 , 5 ),( 72 , 4 , 6 ),
-- 不想毕业
( 81 , 5 , 1 ),( 37 , 5 , 5 ),
-- 好好说话
( 56 , 6 , 2 ),( 43 , 6 , 4 ),( 79 , 6 , 6 ),
-- tellme
( 80 , 7 , 2 ),( 92 , 7 , 6 );
注意:在进行多表查询时,始终贯穿着这四部曲(由繁入简),筛选出符合条件的数据:
1.笛卡尔积
2.连接条件
3.根据需求指定其他条件(筛选行)
4.针对列进行精简(筛选列)

内连接

定义:是内连接查询中一种特殊的等值连接,所谓的自连接就是指表与其自己当前表进行连接。自己和自己做连接。

语法:

select 字段 from 表1 别名1 [inner] join 表2  别名2 on  连接条件 and 其他条件;

select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;(个人最推荐第二种,嘎嘎好用)

案例:

(1)查询许仙同学的成绩

select sco .score from student stu inner join score sco on stu .id =sco .student_id
and stu .name = ' 许仙 ' ;
-- 或者
select sco .score from student stu, score sco where stu .id =sco .student_id and
stu .name = ' 许仙 ' ;
(2)查询所有同学的总成绩,以及同学的个人信息
-- 成绩表对学生表是多对 1 关系,查询总成绩是根据成绩表的同学 id 来进行分组的
SELECT
stu .sn ,
stu .NAME ,
stu .qq_mail ,
sum( sco .score )
FROM
student stu
JOIN score sco ON stu .id = sco .student_id
GROUP BY
sco .student_id ;

(3)查询所有同学的成绩,以及同学的个人信息:

-- 查询出来的都是有成绩的同学, 老外学中文 同学 没有显示
select * from student stu join score sco on stu .id =sco .student_id ;
-- 学生表、成绩表、课程表 3 张表关联查询
SELECT
stu .id ,
stu .sn ,
stu .NAME ,
stu .qq_mail ,
sco .score ,
sco .course_id ,
cou .NAME
FROM
student stu
JOIN score sco ON stu .id = sco .student_id
JOIN course cou ON sco .course_id = cou .id
ORDER BY
        stu.id;

外连接

外连接分为左外连接和右外连接.如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接. 外连接也是多表查询的一种表现形式,一般使用比较少,属于特殊情况特殊处理. 

语法:

-- 左外连接,表一完全显示

select 字段名 from 表名1 left join 表名2 on 连接条件;

-- 右外连接,表二完全显示

select 字段名 from 表名1 right join 表名2 on 连接条件;

为了形象展示内连接,左外连接和右外连接的区别,下面我们来看这一组图:

案例:查询所有学生的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示

-- “ 老外学中文 同学 没有考试成绩,也显示出来了
select * from student stu left join score sco on stu .id =sco .student_id ;
-- 对应的右外连接为:
select * from score sco right join student stu on stu .id =sco .student_id ;
-- 学生表、成绩表、课程表 3 张表关联查询
SELECT
stu .id ,
stu .sn ,
stu .NAME ,
stu .qq_mail ,
sco .score ,
sco .course_id ,
cou .NAME
FROM
student stu
LEFT JOIN score sco ON stu .id = sco .student_id
LEFT JOIN course cou ON sco .course_id = cou .id
ORDER BY
stu .id ;

自连接

顾名思义,自连接就是指在同一张表中进行查询.

案例:

显示所有"计算机原理"成绩比"Java"成绩高的成绩信息(在这个例子中,要想完成不同科目的比较,就需要比较行之间的大小,因为sql是无法实现这个功能的,所以只能将行转为列)

-- 先查询 计算机原理 “Java” 课程的 id
select id,name from course where name= 'Java' or name= ' 计算机原理 ' ;
-- 让我们使用四部曲来写一下
(1)将所有内容进行笛卡尔积
select * from score as s1, score as s2;
(2)连接条件:两张表student_id相同
select * from score as s1, score as s2 where s1.student_id = s2.student_id;
(3)只筛选出要比较的课程id的数据
select * from score as s1, score as s2 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id = 1;
(4)找出结果
select * from score as s1, score as s2 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id = 1 and s1.score > s2.score;

子查询

子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询(这个查询方法虽然很装逼但不建议用,所以了解这个即可,自己写的时候尽量不要这样写)

举个例子:查询与"不想毕业"同班的同学:

select * from student where classes_id=( select classes_id from student where
name= ' 不想毕业 ' );

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符union, union all.使用union和union all时,前后查询结果集中,字段需要一致.(合并查询其实用的很少,了解即可)

案例:查询id 小于3,或者名字为英文的课程

select * from course where id< 3
union
select * from course where name= ' 英文 ' ;
-- 或者使用 or 来实现
select * from course where id< 3 or name= ' 英文 ' ;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode(力扣) 51. N 皇后 (回溯,纸老虎题)

文章目录 题目描述思路分析对于问题1对于问题2 完整代码 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数…

OpenCV C++ 图像处理实战 ——《多二维码识别》

OpenCV C++ 图像处理实战 ——《多二维码识别》 一、结果演示二、zxing库配置2.1下载编译三、多二维码识别3.1 Method one3.1.1 源码3.2 Method two3.2.1 源码四、源码测试图像下载总结一、结果演示 </

nginx https 如何将部分路径转移到 http

nginx https 如何将部分路径转移到 http 我有一个自己的网站&#xff0c;默认是走的 https&#xff0c;其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径&#xff0c;并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…

Jvm虚拟机

问题&#xff1a; 计算机能识别的语言是二进制&#xff0c;Java文件是程序员编写的&#xff0c;如何能够在计算机上运行&#xff1f; 以及Java为什么可以实现跨平台&#xff1f; 一Java的jdk中有jvm虚拟机 可以将文件转换为字节码文件 使得它可以在各种平台上运行&#xff0c;这…

网网络安全基础之php开发 文件读取、写入功能的实现

前言 续之前的系列&#xff0c;这里php开发的文件操作的内容读取以及文本写入的部分 文件读取代码的实现 css代码 本系列的php博客都是这个css&#xff0c;名字都是index.css /* css样式初始化 */ * {font-family: Poppins, sans-serif;margin: 0;padding: 0;box-sizing: …

HDRP图形入门:HDRP渲染管线depth翻转

新项目开坑HDRP渲染管线&#xff0c;花了些时间把项目开发框架和图形工作流更新到最新版本&#xff0c;其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线&#xff0c;距离摄像机越近depth->0&#xff0c;越远depth->1&#xff0c;这也很好理…

酷开科技持续推动智能投影行业创新发展

近年来&#xff0c;投影仪逐渐成为年轻人追捧的家居时尚单品。据国际数据公司&#xff08;IDC&#xff09;报告显示&#xff0c;2022年中国投影机市场总出货量505万台&#xff0c;超80%为家用投影仪。相比于电视&#xff0c;投影仪外观小巧、屏幕大小可调节&#xff0c;无论是卧…

Oracle获取执行计划的6种方法

一、什么是执行计划&#xff1f; 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 执行计划描述了SQL引擎为执行SQL语句进行的操作&#xff0c;分析SQL语句相关的性能问题或仅仅质疑查询优化器的决定时&#xff0c;必须知道执行计划&#xff1b;所以执行计划常用…

docker启动某个镜像一直restarting状态

因为微服务学习的需要&#xff0c;就需要在虚拟机中安装一下Nacos&#xff0c;可哪儿能想到使用docker ps命令一直显示nacos的状态是restarting。 经过一番测试&#xff0c;发现并不是执行代码的问题。上网查了一下&#xff0c;也找不到合适的答案&#xff0c;终于查到了是doc…

Java自学第8课:电商项目(3) - 重新搭建环境

由于之前用的jdk和eclipse&#xff0c;以及mysql并不是视频教程所采用的&#xff0c;在后面运行源码和使用作者提供源码时&#xff0c;总是报错&#xff0c;怀疑&#xff1a; 1 数据库有问题 2 jdk和引入的jar包不匹配 3 其他什么未知的错误&#xff1f; 所以决定卸载jdk e…

SharePoint 的 Web Parts 是什么

Web Parts 可以说是微软 SharePoint 的基础组件。 根据微软自己的描述&#xff0c;Web Parts 是 SharePoint 对内容进行构建的基础&#xff0c;可以想想成一块一块的砖块。 我们需要使用这些砖块来完成一个页面的构建。 我们可以利用 Web Parts 在 SharePoint 中添加文本&am…

CVE-2023-25194 Kafka JNDI 注入分析

Apache Kafka Clients Jndi Injection 漏洞描述 Apache Kafka 是一个分布式数据流处理平台&#xff0c;可以实时发布、订阅、存储和处理数据流。Kafka Connect 是一种用于在 kafka 和其他系统之间可扩展、可靠的流式传输数据的工具。攻击者可以利用基于 SASL JAAS 配置和 SASL …

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件&#xff0c;添加对应的代码&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本&#xff1b; &#xff08;2&#xff09;超出的部分隐藏&#xff1b; &#xff08;3&#xff09;文字用省略号来替代省略的部分&#xf…

STM32-EXTI中断

EXTI简介 EXTI&#xff08;Extern Interrupt&#xff09;外部中断 EXTI可以监测指定GPIO口的电平信号&#xff0c;当其指定的GPIO口产生电平变化时&#xff0c;EXTI将立即向NVIC发出中断申请&#xff0c;经过NVIC裁决后即可中断CPU主程序&#xff0c;使CPU执行EXTI对应的中断程…

【Proteus仿真】【STM32单片机】多路温度控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LED、蜂鸣器、LCD1602、DS18B20温度传感器、HC05蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;默认LCD1602显示前4路采集的…

工业镜头接口类型

现有产品主要有以下接口 1、C:最常见的工业相机接口&#xff0c;受限于接口物理尺寸大小&#xff0c;最大靶面目前是4/3” 2、M42:M421.0,2k和4k线阵相机使用 3、M58S:M580.75,大靶面相机使用&#xff0c;可以转C(限于CH080相机&#xff0c;靶面4/3”)&#xff0c;可以转F,可以…

UML/SysML建模工具更新(2023.10)(1)StarUML、Software Ideas Modeler

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本&#xff1a;Software Ideas Modeler 14.02 更新时间&#xff1a;2023年10月9日 工具简介 轻量级建模工具&#xff0c;支持UML、BPMN、SysML。 平台&#xff1a;Windo…

springboot全局拦截sql异常

起因:非法用户可通过特定的输入(如输入内容超长)等操作,使后台逻辑发生错误,从而使后台sql语句暴露至前台,进而为sql攻击提供条件 处理流程:经查找com.mysql.cj.jdbc.exceptions的父类为SQLException,在全局异常处理类中增加如下配置,经测试不起作用 ExceptionHandler(SQLExce…

Go RabbitMQ简介 使用

RabbitMQ简介 RabbitMQ 是一个广泛使用的开源消息队列系统&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准&#xff0c;为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的&#xff0c;具有高度的可扩展性和可靠性&#xff0c;…

Redis(12)| 过期删除策略和内存淘汰策略

Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 如何设置过期时间 先说一下对 key 设置过期时间的命令。 设置 key 过期时间的命令一共有 4 个&#xff1a; expire key n&#x…