基础语法(二)
Mysql基础语法(二)
Mysql基础语法(二)主要介绍Mysql中稍微进阶一点的内容,会稍微有一些难度(博主个人认为)。学习完基础语法(一)和基础语法(二)之后,建议去尝试50道经典SQL语法题,增强学习和巩固。如下:
- 在基础语法(一)中,主要是介绍Mysql的基本语法,DDL、DQL、DML语句,以及一些聚合函数,以及数据结构及其函数。
- 在基础语法(二)中,主要介绍约束、字符串函数,时间函数,逻辑函数,内外连接、子查询。
一、约束
1.1 基本语法
在使用create语句创建数据库表的时候,可以对每一个字段进行约束限制,Mysql中提供了众多的约束,可以根据字段的需求进行限制。如下:
-
NOT NULL:非空约束,见名知意,也就是限制这个字段的值不能是null空值。
-
UNIQUE:唯一约束,也是比较好理解,该约束下的字段值只能在整张表出现一次。
-
PRIMARY KEY:主键约束,数据库表中每一行数据的唯一标识,该约束下的字段不能为空,且值唯一,也就是说加了主键约束之后,**他的效果相当关于该字段加了非空和唯一约束。**Mysql中一张表只能有一个主键,而且主键的值一般有以下几种方式:
-
DEFAULT:默认约束,也就是说你在插入该字段值的时候,如果插入语句没有设定值,Mysql会默认给其一个初值。
-
CHECK:检查约束,插入数据时,会对该字段的插入值进行检查,是否符合约束条件,符合插入,否则失败。
-
FOREIGN KEY:外键约束,用于两张表的连接,保证数据的完整性。(外键在这里有点难说清楚,后面会有实际例子结合,大家更好理解)。
添加约束的语法SQL:
-- 定义时添加约束
CREATE TABLE table_name (column_name column_type 约束类型,字段名 字段类型 字段的约束类型,
) ;-- 以下是一个示例,有具体的字段约束
CREATE TABLE test (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键id,每一条数据的唯一标识,使用主键',name VARCHAR(10) NOT NULL COMMENT '姓名,不能空',phone CHAR(15) UNIQUE NOT NULL COMMENT '电话,这个字段加了两个约束,非空和唯一',age INT CHECK (age BETWEEN 0 AND 120) NOT NULL COMMENT '年龄',status CHAR(1) DEFAULT '1' NOT NULL COMMENT '用户状态,非空,默认值1'
) COMMENT '测试表';
1.2 外键约束
上面讲到的六种约束里面,其实除了外键的其他五种约束,还是挺好理解的,这里稍微讲解一下外键约束。
-
外键约束其实就是用于保证两张表数据的一致性和完整性。可以看下面的例子,根据三大范式,我们可以知道,有一种情况,假如有一个员工表,需要有员工的个人信息和员工所在的部门信息,如果都把这些字段放在一张表的话,造成数据冗余,且不好维护,假如我需要更改一个部门的名字,那么按照这样的做法,我需要将整个表的数据都更新,那么是不是维护成本很大?所以根据三大范式,我们需要拆分两张表,一个表记录员工信息,一个表记录部门的信息,如下,然后使用员工表的里面的一个字段去连接部门表的id,实现信息衔接。
-
这样是不是就解决了上面提到的问题,假如我需要更改部门的名字,是不是只需要更改部门表的一个字段就行,员工表不需要更改。此时,员工表里面的部门表id字段,就是外键了,**连接外表主键(部门表的主键id)**的字段。
-
那么也许大家会有疑问,我员工表连接着部门表,假如我连接部门表id为1的数据,假如这条数据被删除了,不就造成了数据损失吗。实际上,拥有外键的话,默认情况下,删除数据需要先清楚外键所连接的那一行数据,才能删除,否则删除失败。也就是说,我需要删除部门表id为1的那一行数据,那我需要先去把员工表外键字段里面所有值为1的数据都删除,才能删除部门表id为1的这一行数据,这就是外键之所以能保证数据的完整性和一致性。外键的语法和种类如下**(这个可以看看其他博客,这里不扩展,大家知道有这个东西即可)**:
二、内置函数
Mysql中提供了很多内置的函数,主要是字符串处理函数,数值处理函数和时间类函数,分别有各自的场景。
2.1 字符串类
-- 示例
concat(a,b...n) -- 拼接,将所有字符串拼接,返回一个总的字符串lower(a) -- 全部小写upper(a) -- 全部大写lpad(a,n,b) -- 在字符串a左边依次加上b,直到字符串长度达到n值rpad(a,n,b) -- 在字符串a右边依次加上b,直到字符串长度达到n值trim(a) -- 去掉字符串a头部和尾部的空格,中间的不去掉substring(s,a,n) -- 分割字符串,将字符串s从a开始截取n个长度
- 应用场景有很多,我这里就简单举例,例如我需要将员工表里的员工id由1改成00001,10改成00010,操作如下:
update table_name set id = lpad(id, 5, '0'); -- 使用lpad函数,对id字段的值进行添加,从左边开始添加,达到5个字符长度
2.2 数值类
ceil(a) -- 向上取整,1.1等于2floor(b) -- 向下取整,1.1等于1rand() -- 随机获得0-1的一个小数round(a,n) -- 对a进行四舍五入,保留n位小数mod(a,b) -- 取余
- 举一个用例,假如用户表的字段是用户的邀请码6位随机数字,那么我需要在插入用户数据是,随机生成一个邀请码插入,如下:
insert into table_name(id,number) values (round(rand()*1000000 , 0);-- 解释:这里id字段可以忽略,我插入值是1,这个不是重点,
-- 重点是后面随机生成6位邀请码的函数,解读一下,首先是使用rand函数随机生成一个小数,然后乘以1000000,然后用round保留0位小数,如0.123456789,乘于10的六次方123456.789,使用round保留0位小数,那就是123457,因为round会四舍五入,不过这里主要是想说明round保留0位小数,达到去除小数的效果-- 也许有细心的小伙伴会发现上面这个例子,有一点问题,例如生成的小数是0.012345...
-- 那么乘以10的六次方就是12345,不符合,那需要怎么做呢,如下insert into table_name(id,number) values (lpad(round(rand()*1000000 , 0),6,'0'));
-- 解读一下,老做法,生成小数然后乘以10的六次方,假如是上面12345的情况,就用lpad函数补充到六位数,这个只是我的一个做法,不是唯一做法
2.3 日期函数
curdate() -- 目前时间的日期curtime() -- 目前时间的timenow() -- 现在的时间year(time) -- time的年份month(time) -- time的月份day(time) -- time的日份date_add(time,num) -- time日期加上num后,返回日期datediff(time1,time2) -- 计算两个日期相差多少day,time1 - time2
- 这个的应用场景就更多了,例如我记录插入这条数据的时间,直接在字段值使用now()函数,这里就不举例了,小伙伴们可以发挥想象。
2.4 流程函数
流程函数就是一个SQL里面的逻辑函数,对字段的值进行判断,如果符合xx条件则展示什么,个人觉得这个更多的是前端对值的显示逻辑控制,但是数据库中操作也不少,这里也是介绍一下。
- 上面是一个关于对math、english和chinese三门成绩进行数值判断,多少分则select返回什么等级
三、连接查询
这个是一个重点知识,实际的生产环境中,都会用到这个,一定要仔细学。
3.1 场景介绍
连接查询主要用于连表查询,一共有三个场景,一个多、多对多、一对一,如下:
- 综上,如果是一对多和一对一关系下,都是一个表的一个外键字段,关系到一个表的主键字段。
- 多对多一般都需要第三张表来进行信息对应。
3.2 连接概述
-- 这种多表查询,会返回两张表的笛卡尔积,就是两个表连接的所有数,即很多不相关数据,原因如下:
select * from table_name1,table_name2;
- 也就是说,不加筛选条件的连接查询,会返回笛卡尔积类型的全部数据,笛卡尔积可以去百度一下,这里不赘述,简单来说就是会有很多不相关数据。
- 下面用一张图简单介绍一下连接查询的分类:
3.3 内连接
内连接就是返回两张表的交集数据。内连接分为显式内连接和隐式内连接两种。
3.3.1 隐式内连接
-- 就是通过where进行对应字段的等值匹配,如下举例
select * from emp , dept where emp.id = dept.id
- 相对而言,隐式连接好理解好书写,语法简单,担心的点较少。但是显式连接可以减少字段的扫描,有更快的执行速度。这种速度优势在3张或更多表连接时比较明显。因为隐式内连接是先将两张表拼接在一起,然后再通过where筛选出符合条件的数据,而显式内连接则是通过条件筛选匹配,符合条件的数据才返回到结果集。
3.3.2 显式内连接
使用inner join关键字。表A inner join 表B on 连接条件。
select * from emp inner join dept on emp.id = dept.id;
select * from emp join dept on emp.id = dept.id; -- inner关键字可以省略,效果一样
3.4 外连接
外连接主要分为左外连接和右外连接,左外连接就是查询左表的全部数据和两张表的交集数据,右外连接则是查询右表的全部数据和两张表的交集数据。
- 关键字是:left outer join 和 right outer join(outer可以省略,如下例子)
-- 左外连接
select * from table1 left outer join table2 on table1.xxx = table2.xxx; -- # outer可以省略
select * from table1 left join table2 on table1.xxx = table2.xxx;-- 右外连接
select * from table1 right join table2 on table1.xxx = table2.xxx
- 实际开发中,左外连接比较多,因为右外连接能通过左外连接改写, 即更改表的顺序即可,如下
select * from table1 right join table2 on table1.xxx = table2.xxx;
-- 更改两个表的位置即可select * from table2 left join table1 on table1.xxx = table2.xxx;
3.5 自查询
自查询就是同一张表,自己对自己进行连表查询。以下是一个应用场景:
- 员工表包含上级领导和普通员工**(因为领导也是员工,普通员工也是员工,他们的信息数据都放在员工表)**,有一个字段记录该行数据员工的上级领导id,如果我需要查询该员工的完整信息(包括其上级领导),那么我需要对自己进行连表查询,获得完整数据。
- 自查询一个关键点就是,一定要为表取别名
select * from table_name table1, table_name table2 where table1.xxx = table2.xxx;
3.6 联合查询
联合查询就是把两个相同字段的返回结果进行合并。(前提:两个表的字段名称、数据类型和字段数目都需要一致,否则会报错)
- 关键字:union 和 union all
select * from table1
union
select * from table2
- union all会直接将数据合并在一起,不会去重
- union 则会将重复数据去除
四、子查询
子查询就是嵌套在查询语句里面的查询,后面可以跟着理解。
4.1 标量子查询
标量子查询返回值就是一个标量,一个固定的单个值。为了后面更好理解,后面采用实际SQL语句进行举例。
-- 例如我需要查询张三的生日,查询语句如下,birthday是字段名,emp是表名
select birthday from emp where name = '张三';-- 场景:我们需要查询员工里,所有比张三小的员工,那么我们需要知道张三的出生日期,然后才能进行比较(这里拓展:日期比较能使用大于号比较)-- 如果不使用子查询,我们需要先查询出张三的生日,然后用这个查询出来的值再进行一次SQL查询
select birthday from emp where name = '张三'; -- 例如返回值是2002-11-11
select * from emp where birthday > '2002-11-11';-- 使用子查询,可以简写如下,因为子查询的返回结果是一个标量,那么就是一个值,可以进行比较
select * from emp where birthday > (select birthday from emp where name = '张三');
4.2 单行子查询
行子查询,就是返回值不再是一个单个值,而是一行数据,拥有多个值
- 通常用于多字段值比较
-- 应用场景:查询员工表里面和张三工资和直系领导一样的员工,emp是表面,money是工资字段
-- manager_id是直系领导id
-- 拓展:这个可以用括号进行多字段值比较select * from emp where(money, mangager_id) = (select money , manager_id from emp where name = '张三');
4.3 单列子查询
列子查询,就是返回值是一列多行
- 通常用于比较判断,判断某某字段是否在这个范围
-- 应用场景:查询员工表中,比研发部门所有员工工资高的员工,emp是表面,money是工资字段
-- dept_id是部门id,dept_id = 1代指研发部的部门id
select * from emp where money > all(select money from emp where dept_id = 1);
- 这里介绍一下另外的比较关键字
4.4 多行多列子查询
多行多列子查询,就是返回值结果像一张表的数据,有多行和多列。
- 应用场景:可以把这个查询结果当作一张表,然后和其他表进行连接查询
总结
我自己当时学习是有很多子查询练习,题目和建表语句如下:
- 建表语句
-- 部门表dept
create table dept(
id int auto_increment comment 'id' primary key,
name varchar(60) not null comment '部门名称'
)comment '部门表';insert into dept(id,name)
values(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导id',
dept_id int comment '部门id'
)comment '员工表';insert into emp(id,name,age,job,salary,entrydate,managerid,dept_id)
values
(1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),
(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),
(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);create table salgrade(
grade int,
losal int,
hisal int
) comment '薪资等级表';insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);
- 以下是我自己的写法,可以参考,答案不唯一,结果和思路正确即可
-- no.1
SELECT e.name,e.age,e.job,d.name FROM emp e INNER JOIN dept d ON e.dept_id=d.id;-- no.2
SELECT e.name,e.age,e.job,d.name FROM emp e INNER JOIN dept d ON e.dept_id=d.id WHERE e.age <30;-- no.3
SELECT DISTINCT d.id,d.`name` FROM emp e INNER JOIN dept d ON e.dept_id = d.id;-- no.4
-- 查询大于40岁的员工
SELECT * FROM emp WHERE age > 40;SELECT * FROM emp LEFT JOIN dept on emp.dept_id = dept.id WHERE emp.age >40;-- no.5
-- 由于员工中的工资字段关联于工资等级表的最大最小值SELECT e.*,s.grade FROM emp e,salgrade s WHERE e.salary >= s.losal and e.salary <= s.hisal;-- no.6
-- 查询研发部的员工id
SELECT id FROM dept WHERE `name` = '研发部';SELECT e.*,s.grade FROM emp e,salgrade s WHERE e.dept_id in (SELECT id FROM dept WHERE `name` = '研发部') and e.salary >= s.losal and e.salary <= s.hisal;-- no.7
SELECT AVG(salary) from emp,dept WHERE emp.dept_id = dept.id and dept.`name`='研发部';-- no.8
SELECT salary FROM emp WHERE `name`='杨逍';SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE `name`='杨逍');-- no.9
SELECT AVG(salary) FROM emp;SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);-- no.10
-- 查询本部门的平均薪资
SELECT dept_id,AVG(salary) as avg_money FROM emp GROUP BY dept_id;SELECT * FROM emp,(SELECT dept_id,AVG(salary) as avg_money FROM emp GROUP BY dept_id)as s WHERE emp.dept_id = s.dept_id and emp.salary <= s.avg_money;-- no.11
SELECT COUNT(*),dept.`name` FROM emp , dept where emp.dept_id = dept.id GROUP BY emp.dept_id ;-- no.11 第二种写法
-- 查询指定id的部门人数
SELECT COUNT(*) FROM emp where dept_id =2;SELECT id , name, (SELECT COUNT(*) FROM emp where dept_id = dept.id) FROM dept ;
五、事务
数据是一系列操作的集合,不可分割的整体,要么全部成功,要么都失败!
5.1 开启事务
- 方式一:更改全局设定
SELECT @@autocommit; -- 查询事务是否开启,1表示自动提交(不开启事务)set @@autocommit=0; -- 开启事务sql语句commit; -- SQL都执行成功,可以选择提交事务rollback; -- 如果SQL失败,可以选择回滚事务,也就是前面没有commit提交的SQL失效
- 方式二:手动设置,仅对当前控制台生效
start transaction / begin; -- 两个语句都行,个人使用begin比较多sql语句commit;
5.2 ACID四大特性
- 原子性:事务是不可分割的最小操作单元,要么都成功,要么都失败
- 一致性:事务完成前后的数据是一致的
- 隔离性:两个事务是有隔离级别的,互不影响
- 永久性:事务一旦提交或者回滚,他的数据更改是永久性的
相关文章:
基础语法(二)
Mysql基础语法(二) Mysql基础语法(二)主要介绍Mysql中稍微进阶一点的内容,会稍微有一些难度(博主个人认为)。学习完基础语法(一)和基础语法(二)之…...
FreeTex v0.2.0:功能升级/支持Mac
概述 FreeTex在发布之后,迎来很多反馈,本次根据主流的反馈建议,又进行一轮小升级,正式发布v0.2.0版本,主要升级点如下: 新增识别结果预览显示 Latex识别结果支持格式化输出 软件体积更小,并移…...
MacOS 用brew 安装、配置、启动Redis
MacOS 用brew 安装、配置、启动Redis 一、安装 brew install redis 二、启动 brew services start redis 三、用命令行检测 set name tom get name...
大型旋转机械信号分解算法模块
大型旋转机械信号分解算法模块,作为信号处理算法工具箱的主要功能模块,可应用于各类关键机械部件(轴承、齿轮、转子、联轴器等)的信号分析、故障探测、趋势劣化评估等,采用全Python语言,以B/S模式ÿ…...
Java 中的数据类型误导点!!!
在 Java 中,数据类型分为两大类:基本类型(Primitive Types) 和 引用类型(Reference Types)。它们的存储方式和行为完全不同。 1. 基本类型 Java 有 8 种基本数据类型,它们直接存储值ÿ…...
Linux--JsonCpp
1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库,支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型,是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…...
cv_connection (像halcon一样对区域进行打散)
主题: 分享一个自己用opencv写的小方法, 可以像halcon的connection算子一样, 对cv2.threshold得到的region进行打散, 并返回一个打散后的不相连的region的列表。 代码如下 def cv_connection(region):# he的拓扑信息为 后一…...
ConcurrentHashMap和锁
文章目录 JDK1.7的分段锁JDK1.8的volatileCAS synchronized可重入锁公平锁和非公平锁悲观锁和乐观锁 JDK1.7的分段锁 数据结构:数组(大数组 Segment 和小数组 HashEntry)链表 #mermaid-svg-dfSgz5E7tBmTbx14 {font-family:"trebuchet …...
黑马k8s(二)
集群环境搭建 1.环境规划 2.环境搭建-主机安装 主节点: 软件选择选择 基础设施服务器,这样安装系统完毕之后,会有很多软件我们可以直接使用了 系统点开,点一下完成 ip地址的设置:要跟虚拟网络编辑器,Net…...
LeetCode热题100--240.搜索二维矩阵--中等
1. 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[1…...
python校园新闻发布管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
Spring MVC 视图解析器 (ViewResolver) 如何配置? Spring Boot 是如何自动配置常见视图解析器的?
我们来详细分析一下视图解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自动配置它们的。 视图解析器 (ViewResolver) 是什么? 在 Spring MVC 中,当控制器 (Controller) 方法处理完请求并返回一个逻辑视图名 (String) 时,DispatcherS…...
LeetCode 2918.数组的最小相等和:if-else
【LetMeFly】2918.数组的最小相等和:if-else 力扣题目链接:https://leetcode.cn/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/ 给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正…...
C++修炼:stack和queue
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
欧拉计划 Project Euler 69(欧拉总计函数与最大值)题解
欧拉计划 Project Euler 69 题解 题干欧拉总计函数与最大值 思路code 题干 欧拉总计函数与最大值 小于 n n n且与 n n n互质的正整数的数量记为欧拉总计函数 φ ( n ) \varphi(n) φ(n),例如, 1 、 2 、 4 、 5 、 7 1、2、4、5、7 1、2、4、5、7和 8 …...
TCP Socket编程
最基本的Socket编程 想客户端和服务器能在网络中通信,就得使用 Socket 编程,它可以进行跨主机间通信。在创建Socket时可以选择传输层使用TCP还是UDP。相对于TCP来说,UDP更为简单,下面以TCP为例。 TCP服务端要先建立起来…...
[CLS] 向量是 BERT 类模型中一个特别重要的输出向量,它代表整个句子或文本的全局语义信息
[CLS] 向量是 BERT 类模型中一个特别重要的输出向量,它代表整个句子或文本的全局语义信息。 ✅ 什么是 [CLS] 在 BERT 模型中,每条输入前会加一个特殊的 token:[CLS](classification 的缩写)。这个 token 没有具体语义…...
47.电压跌落与瞬时中断干扰的防护改善措施
电压跌落与瞬时中断干扰的防护改善措施 1. 电压跌落与瞬时中断的影响机理2. 解决措施 1. 电压跌落与瞬时中断的影响机理 跌落发生的常见场景如下: (1)电源插头接触不良,瞬态中断即刻恢复; (2)电…...
LeetCode热题100 两数之和
目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️🐿️🐿…...
【无标题】I/O复用(epoll)三者区别▲
一、SOCKET-IO复用技术 定义:SOCKET - IO复用技术是一种高效处理多个套接字(socket)的手段,能让单个线程同时监听多个文件描述符(如套接字)上的I/O事件(像可读、可写、异常)&#x…...
【数据结构】子串、前缀
子串 (Substring) 字符串中连续的一段字符序列,例如 "abc" 是 "abcd" 的子串。 特点:必须连续,顺序不可改变。 子序列 (Subsequence) 字符串中不连续但保持顺序的字符序列,例如 "acd" 是 "…...
[docker基础四]容器虚拟化基础之 LXC
目录 一 认识LXC 二 LXC容器操作实战 1)实战目的 2)基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3)安装LXC(我的是Ubuntu) 4)操作实战 1. 检查 lxc 是否运行…...
leetcode 2918. 数组的最小相等和 中等
给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数,并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 ,如果无法使两数组相等,则返回 -1 。 示例 1: 输入…...
RT-Thread 深入系列 Part 5:物联网与网络应用实战
摘要 本文聚焦 RT-Thread 在物联网场景下的网络应用实战,从网络协议栈集成到 MQTT/CoAP/HTTP 客户端实现,再到 mbedTLS 安全通信与 OTA 升级,最后以阿里云、腾讯云和 OneNet 平台对接为案例,完整呈现端到端的物联网解决方案落地过程。 目录 网络协议栈:LWIP 与网络设备 MQ…...
onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。
一、软件介绍 文末提供程序和源码下载 onGAU:简化的生成式 AI UI界面开源程序,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…...
Linux系统入门第十二章 --Shell编程之正则表达式
一、正则表达式 之前学习了 Shell 脚本的基础用法,已经可以利用条件判断、循环等语句编辑 Shell脚本。接下来我们将开始介绍一个很重要的概念-正则表达式(RegularExpression,RE) 1.正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常…...
Ubuntu22.04怎么退出Emergency Mode(紧急模式)
1.使用nano /etc/fstab命令进入fstab文件下; 2.将挂载项首行加#注释掉,修改完之后使用ctrlX退出; 3.重启即可退出紧急模式!...
IC ATE集成电路测试学习——开尔文连接
首先,我们先了解一下ATE在测试时的PMU测量原理。 驱动线路和感知线路 为了提升 PMU 驱动电压的精确度,常使用 4 条线路的结构:两条驱动线路传输电流,另两条感知线路监测我们感兴趣的点(通常是DUT)的电压。…...
Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程
Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程 摘要 本技术指南针对Ubuntu与Windows双系统用户,系统阐述NTFS分区挂载的技术原理与操作流程。通过规范的技术说明和专业的故障排除方案,帮助用户在异构操作系统环境下实现文件系统的无缝访问&#x…...
C++学习-入门到精通-【6】指针
C学习-入门到精通-【6】指针 指针 C学习-入门到精通-【6】指针一、指针的初始化二、指针运算符地址运算符&间接引用运算符* 三、使用指针的按引用传递方式四、内置数组标准库函数的begin和end内置数组的局限性 五、使用const修饰指针 一、指针的初始化 指针在声明或赋值时…...
数据集-目标检测系列- 冥想 检测数据集 close_eye>> DataBall
数据集-目标检测系列- 冥想 检测数据集 close * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)数据集训练、推理相关项目:GitHub - XIAN-HHappy/ultralytics-yolo-…...
CoAP 协议介绍及应用场景
CoAP 协议,即受限应用协议(Constrained Application Protocol),是专为资源受限的设备和网络设计的一种应用层协议 ,旨在让小型、低功耗的设备能够接入物联网(IoT),并以最小的资源与更…...
【并发编程】基于 Redis 手写分布式锁
目录 一、基于 Redis 演示超卖现象 1.1 Redis 超卖现象 1.2 超卖现象解决方案 二、Redis 的乐观锁机制 2.1 原生客户端演示 2.2 业务代码实现 三、单机部署 Redis 实现分布式锁 3.1 分布式锁的演变和升级 3.2 setnx 实现分布式锁 3.2.1 递归调用实现分布式锁 3.2.2 循…...
adb命令查询不到设备?
一、背景 -----以鸿蒙系统为例,其他系统类似--- 1、确保adb在电脑上成功安装 2 、连接手机 adb devices 列表中无显示设备 二、解决 1. 手机打开开发者模式 手机型号不同,所以选项不一样 2. 一般流程是:设置--搜索--“开发”--会出现开…...
JavaScript 数组去重:11 种方法对比与实战指南
文章目录 前言一、使用 Set 数据结构二、使用 filter indexOf三、使用 reduce 累加器四、双重 for 循环五、利用对象属性唯一性六、先排序后去重七、使用 Map 数据结构八、使用 includes 方法九、优化处理 NaN 的 filter 方法十、利用 findIndex十一.利用Set和展开运算符处理多…...
SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析
文章目录 一、引言二、YOLOv8 损失函数概述三、SlideLoss 详解(一)SlideLoss 的原理(二)SlideLoss 的代码实现 四、FocalLoss 分类损失函数详解(一)FocalLoss 的原理(二)FocalLoss 的…...
AI 驱动数据库交互技术路线详解:角色、提示词工程与输入输出分析
引言 在人工智能与数据库深度融合的趋势下,理解AI在数据库交互流程中的具体角色、提示词工程的运用以及各步骤的输入输出情况,对于把握这一先进技术路线至关重要。本文将对其展开详细剖析。 一、AI 在数据库交互流程中的角色 (一࿰…...
Jmeter中的BeanShell如何使用?
在JMeter中,BeanShell 是一种基于Java语法的脚本工具,可以通过编写脚本实现动态逻辑处理、变量操作、条件判断等功能。以下是BeanShell的详细使用方法和常见场景示例: 1. BeanShell组件类型 JMeter提供多种BeanShell组件,根据场…...
JDBC工具类的三个版本
一、JDBC连接数据库的7个步骤 1、加载驱动 2、获取连接 3、编写sql 4、获取执行sql的stmt对象 有两种 stmt(存在sql注入问题 字符串拼接) pstmt(预编译可以防止sql注入) 5、执行sql 拿到结果集 6、遍历结果集 7、关闭资源…...
安达发|制药车间生产计划准备性的关键影响因素及优化策略研究
在高度规范的制药行业,生产计划的准备性直接影响企业的运营效率和合规水平。根据FDA统计,2024年因生产计划不当导致的药品短缺案例增加了23%,暴露出制药企业在生产计划管理方面的系统性挑战。本文将从设备、物料、人员、环境、法规五个维度&a…...
独立按键控制LED
目录 1.独立按键介绍 2.原理图 3.C51数据运输 解释:<< >> 编辑 解释:& | 解释:^ ~ 编辑 4.C51基本语句 5.按键的跳动 6.独立按键控制LED亮灭代码 第一步: 第二步: 第三步࿱…...
【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用
目录 一、getters 二、 mapState 三、 mapGetters 四、 mapMutations 五、 mapActions 学到这儿来个小总结:四个map方法的使用 总结不易~ 本章节对我有很大的收获, 希望对你也是!!! 本节素材已上传至Gitee&…...
小程序初始化加载时间优化 步骤思考与总结
回想起来,正确的小程序初始加载时间优化步骤应该为: 一、梳理小程序初始化的步骤,以用户点击小程序为开始(尽可能靠近),以页面渲染出来的时刻为结束—也就是用户感知到的时间。 二、页面渲染时࿰…...
前端弹性布局:用Flexbox构建现代网页的魔法指南
引言:布局的进化史 在网页设计的黑暗时代(2010年前),开发者们用float、position和inline-block这些原始工具进行布局,就像用石器时代的工具建造摩天大楼。直到2012年W3C正式推出Flexbox规范,前端世界终于迎…...
Python基于Django的高校教室管理系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
【金仓数据库征文】_金仓数据库在金融行业的两地三中心容灾架构实践
金仓数据库在金融行业的两地三中心容灾架构实践 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 引言 随着国家对信息技术应用创新࿰…...
利用多AI协作实现AI编辑器高效开发:创新架构与实践基本构想
在当今快速发展的科技领域,AI技术正以前所未有的速度重塑软件开发的流程和模式。传统的软件开发过程往往需要不同专业人员协同合作,从需求分析到产品设计,再到技术实现,每个环节都需要耗费大量的时间和人力。然而,随着…...
【字节拥抱开源】字节豆包团队开源首发 Seed-Coder 大模型
我们非常高兴地向大家介绍 Seed-Coder,它是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体。Seed-Coder 通过以下亮点促进开放代码模型的发展。 以模型为中心:Seed-Coder主要利用大语言模型&#…...
C++GO语言微服务之gorm框架操作MySQL
目录 01 01-gorm介绍 02 02-MySQL操作回顾 03 03-gorm创建表 04 04-MySQL的init函数说明 05 05-gorm框架提供的MySQL连接池 06 06-gorm插入数据 07 07-gorm查询数据 08 08-gorm更新数据 09 09-gorm软删除-创建表 10 10-gorm软删除-实现 11 10-MySQL的8小时时区问题 …...
Webug4.0靶场通关笔记-靶场搭建方法(3种方法)
目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 (1)安装PHPStudy (2)WeBug4.0靶场源码 (3)安装Navicat ÿ…...