1.4、第三阶段 MySQL数据库
root数据库技术
一、数据库理论
1 什么是数据库技术
数据库技术主要研究如何组织、存储数据,并如何高效地提取和处理数据。
2 什么是SQL
SQL(Structured Query Language)
结构化查询语言
SQL
是操作数据库的命令集,也是功能齐全的数据库语言。
SQL
只需要掌握“怎么用”或“做什么”,不需要了解"如何做"或“怎么做”。
SQL
在不同的数据库软件中,有一小部分是不相同的(编程部分),但大多数通用的。
SQL
分类:DDL
数据描述语言(负责创建和管理资源)、DML
数据库操纵语言(负责管理数据)、DTL
数据库事务语言(管理事务)、DQL
数据查询语言、DCL
数据库控制语言(管理数据库运行环境的)。DDL数据定义语言:用来定义数据库对象 – 库,表,列等
创建数据库:create database
查看数据库:show databases
修改数据库的编码格式:alter database 数据库名 charactset 编码格式
删除数据库:drop database 数据库名
切换数据库:use 数据库名
DML数据库操纵语言:用来定义数据库记录(数据)的增删改
增删改:insert into 表名 values
DCL数据控制语言:用来定义访问权限和安全级别
1、授权(grant):grant create session to scott
2、回滚(rollback)
3、提交(commit)
4、新建用户(create user)
DQL数据查询语言:用来查询记录(数据查询)
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:
SELECT <字段名表> FROM <表或视图名> WHERE <查询条件>
3 DB+DBMS+DBS
3.1 Data数据
数据是客观事物的符号表示,数据也是数据库中存储的最基本的单位。
数据分类:文字、图形、图像、音频、视频。
3.2 数据库的定义
数据库: 长期存储在计算内、有组织、可共享的数据集合。数据库中的数据是按一定的数据模型组织、描述和存储。具有较少的冗余、较高的数据独立性和易扩展性以及数据的完整性,并为多个用户共享。
3.3 DBMS
DBMS: 应用于应用软件与数据存储之间的一层数据管理软件,是基础软件(如,Access)也可以是个大型复杂的软件系统(
Oracle, MySQL,SQLServer
)。DBMS的用途: 科学地组织、存储数据,并高效的提取和维护数据。
DBMS的主要功能:数据库定义、数据库操作、数据库的保护(安全性)和维护。
DBMS的优点:
- 较少的数据冗余
- 程序与数据相互对立
- 保证数据的安全、可靠、正确
- 数据可以并发使用并能同时保证一致性
- 数据易维护、易扩展
3.4 DBS
数据库系统
DBS
由数据库、数据库管理系统、应用系统、系统管理员和用户组成的,经历三个阶段:网状模型、层次模型、关系模型(重点)。
数据和信息的关系:
信息是数据经过加工后提取出有用的知识,通过某种数据形式表示的。
信息的层次:从低到高,从客观到信息化, 存在三个世界:现实世界、信息世界、数据世界。
4 范式
范式: 关系模型满足的条件, 主要用于设计关系的一种规范。
4.1 第一范式
1NF
: 关系中的每一个属性都不可分隔。即没有重复的列。
4.2 第二范式
2NF
: 关系中非主键属性完整依赖于主键。即存在主键字段或属性
4.3 第三范式
3NF
: 非主键属性之间不存在依赖关系。即存在外键字段时,只需要另外关系的主键。如:在员工表只需要部门表的部门编号(主键)即可,不需要将部门的名称存放在员工表中。部门编号在员工表中是一个外键。
二、MySQL
数据库
MySQL
数据库是一个关系型数据库管理系统, 目前是属于Oracle公司的。也是一个轻量级数据库。目前主要版本集中5.5/5.6/5.7和8.0, 最新的版本8+。
MySQL
数据库可以安装在Window、Mac、Linux等操作系统上。
MySQL5.6
官方文档:https://dev.mysql.com/doc/refman/5.6/en/
1 安装注意事项
- 安装路径: 尽量安装到D盘,默认安装到C盘
- 版本选择: Server Only 只有服务没有其它的工具。
- 配置中Root用户的口令: root
2 MySQL
数据库操作
进入mysql
的交互环境:
按Win 键 + mysql
,选择 MySQL 5.6 Command Line
进入命令行窗口时,输入root用户的口令, 正常情况下进入MySQL
交互环境。
操作以下的sql
语句:
use mysql;
select user,host from user;
【重要的说明】mysql
数据库管理系统中,包含了很多的数据库和用户,每一个数据库下存在多个关系表、视图、函数或存储过程等资源。
三、mysql
数据库的操作
1 MySQL
数据库命令
1.1 查看所有数据库
show databases;
1.2 打开数据库
use <数据库名>;
1.3查看当前所在的库
select database();
1.4 查看当前库下的表
show tables;
1.5 查看表结构
desc <表名>;
1.6 查看表内容
select 属性1,属性2 ... from <表名或关系表> --查看表所列出的属性的列
select * from <表名>; --查看表的所有列
1.7 查看当前的时间
select now(); --显示时间和日期
select current_date; --只显示日期
select current_time; --只显示时间
select current_timestemp; --显示时间和日期
1.8 查看当前字符集
show variables like 'character%'; --正常情况下字符集是 utf8
2 管理数据库
2.1 创建数据库
create database [if not exists] <数据库名> [charset utf8]; --语法 [如果不存在] [指定字符集]--创建studb数据库,如果存在的话,则不创建,指定字符集为 utf8create database if not exists studb charset utf8;
2.2 删除数据库
drop database [if exists] <数据库>; --如果<数据库>存在,则删除
--删除bookdb数据库
drop database bookdb;
2.3 查看创建数据库的语句
show create database <数据库>;
3 管理表
表的创建、修改、删除以及重命名。
3.1 创建表
create table [if not exists] 表名
(字段名 数据类型[(数据长度)] [约束] [comment '注释信息'], ...)
engine=InnoDB charset=utf8; --引擎 字符集
3.2 数据类型
数值类型:整数类型
int``integer
、小数类型fioat
、精确小数类型decimal
(长度,小数位)。字符类型:固定长度的字符类型
char
(长度)、可变长的字符类型varchar
(长度)。日期类型:日期
date
、时间time
、日期时间timestamp
。文本类型:普通文本
text
, 、大文本clob
。二进制类型:
blob
,如音频或视频的媒体文件、电子合同等。
3.3 字段约束
主键约束:
primary key
主键约束包含唯一约束和非空约束。外键约束:
foreign key
外键引用另一个表的主键字段。唯一约束:
unique
字段的值在所有记录中是唯一的。非空约束:
not null
字段值是不能为null。默认值:
default
字段值如果没有提供时,使用默认值。自增:
mysql
特定的功能(序列),auto_increment
只配合primary key
主键使用,而且数据类型是integer
。
3.4 表的引擎
show engines; --查看mysql数据库存在哪些引擎
3.5 实战
任务1: 创建班级表
班级表的名称:
tb_class
班级表的字段: 编号
cls_id
、名称name
、最大人数max_persons
编号是自增的、主键; 名称是唯一的,不能重复。 最大人数的默认是100人
create table tb_class (cls_id integer primary key auto_increment,name varchar(20) unique,max_person int default 100
);
任务2: 创建学生表
表名:
tb_stu
字段名: 编号
stu_id
, 姓名name
, 性别sex
, 出生日期 birthday编号是主键且自增、性别的默认值为
男
, 出生日期不能为空
create table tb_stu (stu_id integer primary key auto_increment,name varchar(20),sex char(1) default '男',birthday date not null
);
任务3: 创建老师表
表名:
tb_teacher
字段名: 编号
tid
, 姓名name
, 工龄work_years
编号主键且自增,姓名不能为空,工龄默认为3年
create table tb_teacher(tid integer primary key auto_increment,name varchar(20) not null,work_years int default 3
);
任务4: 创建课程表
表名:
tb_course
字段: 编号
cid
, 名称name
, 带课老师编号tid
编号主键且自增,名称唯一,老师编号外键(引用老师表
tb_teacher
的主键字段)
-- 字段级外键约束
create table tb_course
(cid integer primary key auto_increment,name varchar(20) unique,tid integer references tb_teacher(tid)
);
-- 表级外键约束
create table tb_course
(cid integer primary key auto_increment,name varchar(20) unique,tid integer,constraint tid_fk foreign key(tid) references tb_teacher(tid)
);
注意:表级的方式添加外键约束
constraint [约束名] <约束类型>(字段) references <引用表名>(引用字段)
任务5: 创建成绩表
表名:
tb_score
字段: 学生编号
sid
, 课程编号cid
, 成绩score
学生编号是外键(引用学生表的编号), 外键约束名定为
tb_score_sid_fk
课程编号是外键(引用课程表的编号),外键约束名定为
tb_score_cid_fk
成绩的默认为 0.0
create table tb_score
(sid integer,cid integer,score float default 0.0,constraint tb_score_sid_fk foreign key (sid) references tb_stu(stu_id),constraint tb_score_cid_fk foreign key (cid) references tb_course(cid)
);
3.6 修改表(日期:3.22)
1 修改表名
alter table 表名 rename [to] 新表名; --语法
--如, 修改`tb_stu`表名为`tb_student`;
alter table tb_stu rename tb_student;
2 修改字段名
--语法
alter table 表名
change 原字段名 新字段名 数据类型[(长度)] [约束];
--如,修改`tb_student`表中的`name`字段名为`sname`
alter table tb_student
change name sname varchar(20);
3 修改字段
一 般用于修改字段的类型和长度、以及非空约束和默认值。
--语法
alter table 表名
modify 字段名 数据类型[(长度)] [约束] [comment '注释'];--如1:修改`tb_teacher`表的`name`字段的数据长度为30并且默认值为`老师`。
alter table tb_teacher
modify name varchar(30) default '老师';
--如2: 修改`tb_class`表的`name`字段长度为40且非空,同时修改`max_person`字段的默认为120
alter table tb_class
modify name varchar(40) not null,
modify max_person int default 120;
4 删除字段
不能直接删除主键、外键和唯一约束的字段。
--语法
alter table 表名
drop [column] 字段名;--如1: 删除`tb_score`表的`score`字段。
alter table tb_score
drop score;
--如2: 尝试删除`tb_score`表的`cid`字段(外键约束的字段)应该先删除外键约束再删除字段。
alter table tb_score
drop foreign key tb_score_cid_fk;
5 增加字段
--语法
alter table 表名
add [column] 新字段名 数据类型[(数据长度)] [约束]; --如:向`tb_score`表添加新的字段`cid`和`score`。
alter table tb_score
add column cid integer,
add column score float;
6 增加外键约束
--语法
alter table 表名
add constraint 约束名 foreign key (字段名) references 引用的表名(引用字段);--如: 向`tb_score`表的`cid`字段添加外键约束`tb_score_cid_fk`并引用`tb_course`表的`cid`主键字段。
alter table tb_score
add constraint tb_score_cid_fk foreign key (cid) references tb_course(cid);
7 查指定表的所有约束
information_schema.table_constraints
字典表
select table_name,constraint_name,constraint_type --表名、约束名、约束类型
from information_schema.table_constraints
where table_name='tb_score';
3.7 删除表
--语法
drop table [if exists] <表名>;--如:删除tb_course表
drop table tb_course;
4 操作表的数据
DML
数据库操纵语言:insret、update、delete
等语句
4.1 插入数据
--语法1:单条数据插入
insert into 表名[(字段名1, 字段名2,...字段名n)]
values (字段1值, 字段2值,...字段n值);--语法2:多条数据插入
insert into 表名[(字段名1, 字段名2,...字段名n)]
values
(字段1值, 字段2值,...字段n值),
(字段1值, 字段2值,...字段n值),
(字段1值, 字段2值,...字段n值),
...
(字段1值, 字段2值,...字段n值)
;
任务1:班级表插入一条数据
班级名
Testing-2021
,最大人数50
insert into tb_class(max_person, name)
values (50, 'Testing-2021');
任务1: 班级表批量插入
insert into tb_class(name, max_person) values
('Testing-2022-01', 50),
('Testing-2022-02', 45),
('Testing-2022-03', 80);
4.2 更新数据
更新数据是指修改表中某一条记录或元组中对应属性的值,支持同时修改多个属性值。当然可以通过选择操作(条件选择),选择符合条件的元组或记录。
--语法
update 表名 set
字段1=值 [, 字段2=值...]
[where 条件表达式];
条件表达式
- 等值条件 =, 如
name='disen'
- 关系条件 :> 大于, < 小于, >= 大于等于, <= 小于等于, != 不等于
- 非空条件 not null 非空, is null 为空
- 包含条件 in (条件值,条件2,…) , 条件值之间是"或"的关系
- 逻辑关系: and 且的条件, or 或的条件
- 区间条件: between 开始值 and 结束值, 是闭合区间 [开始值, 结束值]
- 模糊条件: like 匹配字符
- 匹配字符的通配符: % 任意个数任意字符, _ 任意一个字符
任务1: 将低于50人的班级更改为100人的容量
update tb_class
set max_person=100
where max_person < 50;
任务2: 将名字中包含江
的老师等级更改为特级
update tb_teacher
set level='特级'
where name like '%江%';
4.4 删除数据(不加条件是清空表内容)
--语法:
delete from 表名
[where 条件表达式];
【注意】如果不加where条件时,表示清空表数据。
【扩展】事务操作
begin 开启事务
commit 提交事务
rollback 回滚事务,取消任务开始到当前的所有操作。
任务1:开启事务并清空成绩表,查看数据之后回滚事务
begin;
delete from tb_score;
select * from tb_score;
rollback;
任务2:删除等级为null的老师记录
delete from tb_teacher
where level is null;
5 查询数据
查询数据是
mysql
最主要的功能之一,查询语句涉及的面比较广。涉及选择、投影和连接等操作。
5.1 select 语句
select 语句,主要是选择哪些字段,在select语句中,可以使用一些表达式显示运算之后的结果。
语法:
select [all|distinct] 字段名或表达式 [as 别名] [,字段名或表达式...]
from 表名 [as 别名]
[where 条件表达式]
[group by 字段或表达式]
[having 分组条件表达式]
[order by 排序字段 [ASC|DESC]]
[limit 分页表达式]
[for update]
select 中的表达式,可以进行算术计算,也可以调用mysql函数。
【说明】having子句用于聚合统计之后的数据作为条件,如显示总成绩高于290的课程或学生。
5.2 条件语句
where子句,设定选择记录的条件。
如:查看学号大于等于2且成绩等于100分的课程号和成绩信息, 可以去重
select distinct cid, score
from tb_score
where sid>=2 and score=100;
5.3 排序语句
order by 子句,可以针对某一列的值进行排序(行记录的先后顺序)
如:按成绩高低进行排序,显示所有的学生不同课程的成绩信息
select sid,cid, score
from tb_score
order by score desc;
【说明】DESC/desc 表示从高到低的降序,ASC/asc 表示从低到高的升序, 默认asc
5.4 分页语句
limit子句,格式: limit 开始记录序号,每一页显示的记录数
记忆的格式: limit offset, page_size
第一条记录的序号: 0
如每页显示3条记录
第一页的limit的写法: limit 0,3;
第二页的limit写法: limit 3, 3
第三页的limit写法: limit 6, 3
总结:查看第n页的limit写法
- limit (n-1)*page_size, page_size
如2:按每页3条记录,查看第2页的成绩表数据
select * from tb_score limit 3,3;
5.5 分组统计语句
group by 子句
针对某一个字段的值进行分组,分组之后的数据可以进行聚合统计。
聚合统计需要mysql的函数:
- sum()求和
- avg()求平均
- max() 最大值
- min() 最小值
- count() 统计行数
任务1:统计每一位学生的总成绩
select sid, sum(score) as total
from tb_score
group by sid;
【注意】在select子句中,没有 使用聚合函数的列必须要放在group by 子句中。
任务2: 统计每门课程的考试人数和平均成绩
【扩展】四舍五入的函数: round(数,小数位), 默认小数位为0
selectcid,count(1) as persons,round(avg(score), 1) as avg_score
from tb_score
group by cid
order by avg_score desc;
【扩展】
mysqldump -u用户名 -p密码 数据库名>导出路径和文件名
source命令,在mysql
交互环境中执行sql
文件中的有效的语句。
如:
将taiyang
数据库导出成sql
文件的sql
语句:mysqldump -uroot -proot taiyang>d:\taiyang.sql
将创建表的所有的sql
语句复制到d:\init.sql
文件中, 导入文件需要在mysql
命令行(交互环境)执行命令: source d:/init.sql
5.6 多表连接语句
简单地理解多个表之间相互联系(关联),通过连接的
sql
语句,将多表之间的数据显示在一起。【注意】多表连接时,必须存在连接条件,否则会出现笛卡尔乘积(n*m)。
1 等值连接
语法:
select [ [表名.]字段或表达式 [as 别名], ...]
from 表名1 [as 别名1], 表名2 [as 别名2] [, 表名3 ...]
where 表名1.字段名=表名2.字段名
[and 表名2或1.字段名=表名3.字段名]
[and 表名1或2或3.字段名=表名4.字段名....]
【总结】如果存在n张关系表进行连接,必须存在n-1的等值连接条件。
任务1: 查看所有学生的所有课程的成绩,显示学生名、课程名和成绩并按每位学生的成绩进行排序:
select s.sname as '姓名', c.name as '课程', sc.score as '成绩'
from tb_score sc,tb_student s,tb_course c
where sc.sid=s.stu_id
and sc.cid=c.cid
order by sid DESC, score DESC;
2 join连接
join连接表等值连接更方便使用,而且支持外连接。即等值连接相当于join的内连接。
语法:
select 字段或表达式 [,...]
from 表名1
[natural|left|right] join 表名2 on (连接条件1[,连接条件2])
[join 表名3 on (连接条件2) ]
[join ...]
[where 条件表达式]
【说明】
natural
自然连接,从两个表中找到相同的字段名作为默认的连接条件- left 左外连接, 查询的结果除了内连接(两个集合交集)之外,还包含左边表的其它数据。
- right 右外连接,查询的结果除了内连接之外,还包含右边表的其它数据。
- left和right都可能存在 null空数据。
3 union联合
将多个select语句的查询合并到一起,但是select选择的字段尽量保持一致。默认显示是第一个select语句的字段名。
一般在分表的数据查看情况下使用,分表指按某一种分类将数据分开存储,避免一张表存放过多的数据。分表或分库是数据库的优化手段,解决查询效率问题。
语法:
select ... from ... [where... order ..]
union [all | distinct ]
select ... from ... [where ... order ..]
如: 将成绩表的每位学生的平均成绩和总成绩的统计数据合并
select sid,sum(score) total from tb_score group by sid
union
select sid,round(avg(score)) avg from tb_score group by sid;
5.7 子查询语句
子查询:select语句中包含select语句。
子查询应用的场景: 复杂的sql查询语句需要从不同的select语句查询结果中组合的。
子查询可以使用的位置: where条件中,join连接, update 更新,insert插入数据等。
1 where中应用
语法:
select ... from ...
where 字段或表达式 [=|in|>=|<=|>|<| !=](select 字段或表达式 from ...);
任务1: 查询高于最低平均成绩的学生及其成绩,显示学生姓名、课程名和成绩
select min(avg) as min
from
(select sid,avg(score) as avg from tb_score group by sid) A;
【注意】如果from 后跟上子查询时,必须给定别名,表示从某一个表中查询数据。join的子查询也需要一个表的别名。
2 join中应用
语法:
[left | right] join (select ...) 别名 on (连接条件)
使用join方式完成where应用中
的任务2
select c.*, if(A.cnt is null,0,A.cnt) as cnt
from tb_class c
natural left join
(select cls_id,count(1) as cnt from tb_studentgroup by cls_id) A
where cnt < 2 or cnt is null;
【扩展】mysql
存在一个分支函数 if(条件, 为true值,为false的值)
3 update中应用
update更新语句,在set子句对子查询的结果赋值给某一个字段。
语法:
update 表名,(select ... ) 别名 set 字段1=别名.字段名 [,字段2=别名.字段名 ...]
【注意】更新字段值时一般是单行结果的子询中某一列的值。
任务1:将班级最大人数低于平均数时,更改为平均数。
update tb_class,(select round(avg(max_person)) avg from tb_class) a
set max_person=a.avg
where max_person < a.avg;
【注意】子查询可以理解为一个虚拟的表,不能直接在set中使用子查询作为某一个字段的值。
4 insert中应用
插入数据时,可以使用子查询,将查询到的数据插入到某一个表中。
同插入数据使用子查询的方式,create table也可以使用子查询。
语法:
insert into 表[(字段1, ....)]
select ...
【注意】向表的哪些字段插入数据时,在select子句中必须有对应的字段值。
【扩展】create table
使用子查询的语法
create table 表名 [as]
select ...
【问题】创建表的字段只有select中选择的字段而且不存在约束。
任务1:根据班级将成绩表分成多分,即创建不同班级的成绩表;
-- 新的成绩表与原成绩表的结构保持不变
create table tb_cls1_score as
select * from tb_score where score=0;
任务2:继任务1,将不同班级学生的成绩分别插入指定的表
-- 将班级1的学生考试成绩插入到 tb_cls1_score
insert into tb_cls1_score
select sc.*
from tb_score sc join tb_student s on (sc.sid=s.stu_id)
where s.cls_id=1;
6 mysql内置函数
6.1 字符串函数
针对字符串的运算提供的内置函数
1 ascii函数
将一个左边字符转化为ascii值,asscii中的字符只占一个字节。
select ascii('a'); -- 查看字符 a的ascii的十进制的数值
select char(97); -- 将数值转化为ascii中的字符,如97转化为a字符
select oct(n); --将n的数值转化为8进制的字符串
select hex(n) --将n的数值转化为16进制的字符串
select bin(11); -- 查看11的二进制的字符串
2 字符长度
select char_length('狄哥'); -- 显示字符个数 【重点】
select length('狄哥'); --显示字节个数
-- 显示字符所占的字节长度,一个英文在utf8字符集中占1个字节,一个中文在utf8中占3个字节。
-- 常用的字符集:gbk/gb2312 (英文占1字节,中文占2字节), unicode每个字符占2字节
-- 设计表的字段时,使用varchar(length) length表示是字符的个数【面试】
3 字符串拼接
-- 字符串拼接 【重点】
select concat('hi', ',', 'good');
select name, concat(work_years,'年') as work from tb_teacher;
4 查找字符串位置
instr(str, substr); --从str中查找substr第一次出现的位置
-- 显示的位置是从1开始的。
select instr('hi,disen', 'disen') as position;
5 大小写转换
-- low() 转小写
-- upper() 转大写
6 删除空白
-- trim() 删除字符串两边的空白
-- ltrim() 删除字符串左边的空白
-- rtrim() 删除字符串右边的空白
select trim(' disen ') a, ltrim(' **disen** ') as b,rtrim(' disen ');
7 替换
-- replace(str, oldstr, newstr) 从str中将oldstr替换成newstr
select replace('hi,disen', 'disen', 'jack') as rt;
8 字符串截取
-- substr(str, pos, len) 从pos开始截取子len长的子字符串,len默认为最后的位置
select substr('hi,disen',4);
select substr('hi,disen,very good!', 4, 5);
6.2 数值函数
1 绝对值函数
abs() -- 绝对值
select abs(-90);
2 小数取整函数
ceil() -- 上行取整
floor() -- 下行取整select ceil(15.5), floor(15.5);
3 四舍五入函数
round(n, 小数位数) --四舍五入
select round(13.4456, 3);
4 次幂函数
pow(m, n)/power() -- m的n次幂
select pow(3, 2);
5 开方函数
sqrt(n) --开平方根的函数
select sqrt(9);
6 取余函数
mod(number, m) --计算 number对m的取余
-- 12 % 8 => 4
select mod(12, 8);
7 取整
select 10 div 3;
8 截断函数
truncate(x, d) -- 保存x中d位小数,如果d是负数时,表示截断整数部分内容。
select truncate(12.56, 1); 结果是12.5
select truncate(1987, -3); 结果是1000
6.3 日期函数
1 日期相关的函数
now() -- 当前日期时间
current_date() -- 当前的日期
year(date) -- 从时间数据中提取年
month(date) -- 提取月份
day(date) -- 提取日
date(timestamp) -- 从日期时间中提取日期
week(date) -- 显示date是一年中第几周 【重点】, 从0开始
weekofyear(date) -- 显示date是一年中的第几周,从1开始
yearweek(date) -- 返回 date中年和一年中的第几周
dayofyear(date) -- 一年中的第几天 (1-366)
dayofweek(date) -- 一周内的星期几的索引 ,星期日是1
dayname(date) -- 显示星期几
dayofmonth(date) -- 一月中的第几天索引,从1开始,范围(0-31)select dayofmonth(current_date);
2 时间相关函数
current_time() -- 当前时间
hour(time) -- 取小时
minute(time) -- 取分钟
second(time) -- 取秒
time(timestamp) -- 从日期时间信息中,提取时间
3 日期时间转换相关的函数
timestamp(e1) -- 将e1日期转化日期时间
timestamp(e1, e2) -- 将e2的时间加到e1得到新的日期时间
time_format(time, format_str) -- 按format_str格式转化time字符串
date_format(date, format_str) -- 按format_str格式转化date字符串
str_to_date(str, format) -- 将format格式的str字符串转化为日期时间。select timestamp('2022-03-12');
select timestamp('2022-03-24 09:10:10', '13:15:25');
select char_length(time_format(now(), '%H/%i/%s'));
select time_format('12:15:18', '%i:%s');
select date_format(now(), '%m/%d/%y');-- 日期或时间计算时,不能按默认的YYYY-dd-mm格式转化的认为不合法的日期或时间
select datediff(now(), '2012年10月12日');select str_to_date('2012/10/12','%Y/%m/%d');
select str_to_date('10月12日 12年','%m月%d日 %y年');
select datediff(now(), str_to_date('2012年10月12日','%Y年%m月%d日'));
4 时间间隔相关的函数
datediff(d1, d2) -- 计算d1-d2的相隔的天数
timediff(e1, e2) -- 返回 e1-e2相差的时间,结果是时间格式。
adddate(date, INTERVAL n UNIT), adddate(date, days)
-- UNIT时间单位: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
-- n表示,可以是数值,也可以是字符串,如果字符串存在day,最后出现秒,unit则为day_second
addtime(time, add_time)
subdate(date, INTERVAL n UNIT)
subtime(time, sub_time)select datediff(now(), '2022-01-12');
select timediff(now(), '2022-01-12 12:10:10');select adddate(now(), interval 25 day);
select adddate(now(), interval '25 10' day_hour);
select subdate(now(), interval 40 day);
重要的日期格式的字符串:
%Y-%m-%d %H:%i:%s
6.4 分支函数
1 if函数
if(条件表达式, 结果为true的值, 结果为false的值), 用于select子句,where子句。
任务1
存在以下A表:
year month amount
1991 1 1.1
1991 2 1.2
1992 1 2.1
1992 2 2.2
写出sql语句,输出以下结果:
year m1 m2
1991 1.1 1.2
1992 2.1 2.2
sql语句:
create table a(year int, month int, amount float);
insert into a values
(1991, 1, 1.1),
(1991, 2, 1.2),
(1992, 1, 2.1),
(1992, 2, 2.2);
selectyear,max(round(if(month=1, amount, 0),1)) m1,max(round(if(month=2, amount, 0),1)) m2
from a
group by year;
2 case语句
语法:
select ...,
case [字段名或表达式] when 条件或值 then 条件为true结果when 条件2或值2 then 条件2为true结果2...else 以上条件都不为true时的结果n end 别名
from ...
如1:
select case 1+1 when 1 then '错误' when 2 then '正确' else '系统出问题了' end result;
【注意】如果when中是单个值时,表示值和 case后表达式是等值判断
如2:
select case when 1>2 then '1大于2'when 1=2 then '1等于2'else '1小于2' end result;
【注意】when中关系表达式,计算关系表达式的结果,case后不需要字段或表达式。
6.5 加密函数
加密函数,即将明文转化为密文,更好地保护数据。
【扩展】加密算法分类: 对称加密(AES, DES)和非对称加密(RSA, 公钥与私钥,如ssl证书采用RSA算法)
md5(str) -- 通过md5算法,将str明文转化为32长度的密文,且不可逆的。
select md5('123');
select md5('disen');sha1(str) -- 通过sha1算法,将str明文转化为密文,密文的长度一般为40位, 不可逆的。
select sha1('disen');password(str) -- 将str转化为密文, 一般用于口令加密。
-- 对称加密与解密
aes_encrypt(str, key) -- str明文
aes_decrypt(en_str, key) -- en_str 加密后的密文
hex(str) --将str内容转化16进制内容
unhex(16进制的str) -- 取消16进制转换的内容select hex('disen');
select unhex('646973656E');
select hex(aes_encrypt('disen', 'abc123'));
select aes_decrypt(unhex('EB0BD931B06891CBDEEB3A90A1BDDCA0'), 'abc123');
7、视图
视图是一张虚拟的表,是一种高级的子查询且存在名称。即视图是一个select查询语句。
视图的数据取决于是select语句,一般存储复杂的且频繁使用(查询)的select语句
7.1、视图创建的语法:
create or replace view 视图名 as select 语句;
如1: 创建视图,存储查询每门课程的平均分数和课程名的数据的sql
create or replace view avg_sc as
select cid,ceil(avg(score)) avg_score from sc group by cid;
视图创建成功之后, 可以通过 show tables
查看。
从视图中查询数据时,类似于从表中查询数据:
select * from avg_sc;
【注意】视图一般用于查询,不能像表一样插入、修改和删除数据。但是表的数据发生变化之后,会影响视图查询的结果。因此,可以把视图查看是一个子查询。
7.2、删除视图:
drop view 视图名; eg:drop view avg_sc; --删除视图 avg_sc
查看stu数据库下所有的视图:
select table_name
from information_schema.views
where table_schema='stu';
8、索引
索引是数据库的一种数据结构(b+树、hash),为表的数据建议一个快速查询的方式。
可以创建表的一个或多个字段的索引,一般索引字段是在查询条件中使用。
思考:
- 表中的每一个字段都可以创建索引? 可以
- 一张表中的索引是否越多越好?不是的,因为索引过多的时候,影响DML语句效率。
索引分类: 普通索引、主键索引、唯一索引、联合索引、全文索引、分区索引
- 主键索引, 一般是创建主键约束时自动创建的索引 - 唯一索引,字段存在唯一约束时也会自动创建唯一索引,也可以手动创建唯一索引 - 联合索引,也称之为组合索引或集簇索引,由多个字段联合创建的索引。
索引创建的语法:
create [online | offline] [unique|fulltext| spatial ]
index 索引名 [ using { btree | hash }]
on 表名(字段名[(长度)] [asc|desc] [, ...] )
【说明】online 表示启用索引, offline关闭索引
如1: 为学生表的name字段创建一个唯一索引
create unique index name_unique using hash on student(name desc);
索引删除的语法:
drop index 索引名 on 表名;
如2: 删除name_unique索引
drop index name_unique on student;
如3: 创建成绩表sc的sid和cid两个字段的组合索引
create index sid_cid_index using btree on sc(sid asc, cid desc);
检查sql语句是否使用索引:
explain select * from sc where sid='01' and cid='01';
【扩展】查看表中的所有索引
select i.index_id,i.name, i.type,t.name
from information_schema.innodb_sys_indexes i
join information_schema.innodb_sys_tables t on (i.table_id=t.table_id)
where t.name like 'stu/%';
9、事务
事务是一系列操作的组合,事务具有ACID的特性。
ACID
Atomicity (原子性): 事务内发生的所有操作要么全成功,要么全失败。Consistency(一致性): 事务开始和结束时,数据保持一致。Isolation(隔离性): 事务之间互不影响Durability(持久性): 数据一旦保存,将永久性存在,不受系统影响。
事务的隔离级别
read uncommitted 读未提交, 可以读取另一个事务中未提交的数据 【脏读】【不可重复读】【幻读】
read committed 读已提交, 可以读取另一个事务中已提交的数据【不可重复读】【幻读】
repeatable read 可重复读,事务开启之后,数据不会发生变化。【幻读】
serializable 串行化,一个事务结束之后,另一个事务才能开始。存在锁的概念。
查看当前事务的隔离级别:
show vairalbes like '%isolation%';
设置当前的会话的事务隔离级别
set session transaction isolation level <隔离级别名称>;
【扩展】事务的还原点
savepoint 名称;
--取消还原点之后的所有操作
rollback to 还原点
【扩展】自动提交事务
当开启事务之后,执行了
DDL
语句时,事务会自动提交。
begin;
delete from login where name='disen';
create table abc(name varcher(20));
--以下提交或回滚事务没有任何意义,因为上一行发生了DDL语句,自动提交了事务
commit;
10、用户和权限
10.1:查看当前系统用户
select user,host,password from mysql.user;
【说明】mysql.user表存储系统的所有用户信息。user字段表示用户名,host表示当前用户登录的主句ip地址。如localhost
表示只能在本地进行登录进入到mysql环境中。如果用户需要在10.36.174.22
主机上登录mysql系统,需要更改host字段值。理解为host即是可登录mysql系统的ip白名单。
10.2:创建用户
语法:
create user '用户名'@'主机地址' identified [with mysql_native_password] by '口令';
【注意】with mysql_native_password
是mysql8.0向下加密兼容
如1:创建任何主机可连接的sdd用户,口令sdd
任意主机:%
use mysql;
create user 'sdd'@'%' identified by 'sdd';
10.3:修改用户口令
语法:
set password [for user]=password('口令')|old_password('口令')|'口令'
user
部分包含用户名和主机的
如:将sdd用户的口令修改为sdd888
set password for sdd=password('sdd888');
语法2:修改用户口令过期和口令
--口令失效
alter user '用户名'@'主机' password expire;
--修改口令
alter user '用户名'@'主机' identified by '口令';
10.4:删除用户
语法:
drop user '用户名'@'主机' 或 用户名;
如:删除disen
用户
drop user disen;
10.5:用户授权
语法:
grant 权限 on [table|function|procedure] <*|*.*|db.*|db.table>
to 用户; --数据库.表|函数|存储过程
--刷新权限
flush privileges;
如1:授予disen
用户操作所有数据库的权限
grant all on * to disen;
如2:授予disen
用户管理stu
数据库的所有权限
grant all privileges on stu.* to disen;
如3:创建jack用户操并授予查询stu
数据库所有表权限
create user 'jack'@'%' identified by 'jack';
grant select on stu.* to jack;
如4:授予jack用户向stu.student
表中插入数据的权限
grant insert on stu.student to jack;
如5:授予jack用户刷新权限
grant reload on *.* to jack;
10.6:撤销权限
语法:
revoke [all privileges] [权限名]
on [table|function|procedure] <*|db.*|db.table> from 用户
如1:撤销jack用户向stu.student
插入权限
revoke insert on stu.student from jack;
如2:撤销jack查询stu
库的所有权限
revoke select on stu.* from jack;
11、mysql
编程
11.1 函数编程
语法:
create function 函数名([参数 数据类型[长度],...])
[deterministic] [comment '说明']
returns [数据类型(长度)]
return 返回的函数结果数据;
如:定义aes
加密函数,实现aes
加密
create function aes(str1 varchar(20)) returns varchar(50)
return hex(aes_encrypt(str1,'123%^@*'));
--使用aes函数
select ase('disen');
如:实现aes
加密和解密算法
--删除函数
drop function aes;create function aes(str1 varchar(50),flag int) returns varchar (50)
return if(flag=0,hex(aes_encrypt(str1,'123%^@*')),if(flag=1,
aes_decrypt(unhex(str1),'123%^@*'),'无效的内容'));
将以下的aes函数中的判断尝试修改为case表达式:
drop function aes;
create function aes(str1 varchar(50),flag int) returns varchar (50)
return case flag when 0 then hex(aes_encrypt(str1,'123%^@*'))when 1 then aes_decrypt(unhex(str1),'123%^@*'),else '无效的内容' end;
11.2 存储过程
语法:
delimiter &&
create procedure 存储过程名([in|out|inout] 参数名 数据类型(长度),...)
beginselect into 语句;
end &&
delimiter ;
因为在存储过程的body中可能有sql
语句需要执行,默认sql
语句结束标识符是;
一个完整的sql
语句也是使用sql
结束,为了避免创建完整的存储过程之中出现;
可以使用delimiter结束符
命令声明临时的sql
结束符。
如:定义村相互过程,查询某一个学科的平均分
delimiter &&
create procedure course_avg(cname varchar(20),out avg decimal)
beginselect avg(score) into avgfrom sc natural join coursewhere name=cname;
end &&
delimiter ;
执行存储过程:
--调用存储过程,参数写法:常量,变量 变量以@开头+变量名
call 存储过程名(参数,....)--查询存储过程执行的结果
select @变量名;
call course_avg('语文',@avg);
select @avg
如2:创建存储过程查询不同学科的最高分、最低分、平均分和总分,并直接显示
delimiter &&
create procedure course_avg(cname varchar(20))
beginselect cname,avg(score) avg,max(score) max,min(score) min,sum(score) sumfrom sc natural join coursewhere name=cname;
end &&
delimiter ;
删除存储过程:
drop procedure 存储过程名;
11.3 触发器
触发器:监听对数据的操作事件,如当删除数据时,如果存在删除事件监听的触发器,则会执行触发器。在触发器,可以对操作前或后的数据进行处理(备份、验证)。
创建触发器语法:
create trigger 触发器名 <before|after> <insert|update|delete>
on 表名 for each row
trigger_body
【重要说明】在触发器的body中,存在两个特殊的对象OLD
、NEW
分别代表是原行数据和新行数据。如针对before delete
事件触发器来说,OLD
表示即将删除的数据(元组)。如针对before insert
事件触发器来说,NEW
代表是即将插入的数据(元组)。
如1:备份一个空的成绩表,当成绩表的数据被删除时,将原数据插入到备份的成绩表
--创建一个空的成绩表
create table sc_copy as
select * from sc where 1!=1;--创建触发器
create trigger watch_sc_delete before delete on sc for each row
insert into sc_copy values(OLD.sid,old.cid,OLD.score);--尝试删除一条记录
begin;
delete from sc where sid='07' and cid='03';
select * from sc_copy;
rollback;
如2:创建一个用户登录表,表中存在账号和口令的字段,并插入2条记录,同时创建登录表的更新后的触发器,在触发器,将更改前后的口令保存到一个用户更新日志表中(字段:更新时间,账户,原口令,新口令)
--创建登录表 login
create table login(id int primary key auto_increment,name varchar(20) unique,pwd varchar(20) notnull
);--创建变更登录用户口令日志表
create table update_pwd_log(id int primary key auto_increment,update_time timeusername varchar(20),old_pwd varchar(50),new_pwd varchar(50)
);--插入两位登录的用户
insert into login(name,pwd) values
('disen','123'),
('jack','888');--创建触发器
create trigger watch_update_pwd after update on login for each row
insert into update_pwd_log(update_time, username, old_pwd, new_pwd)
values (current_timestamp(), OLD.name, OLD.pwd, NEW.pwd);-- 变更disen用户的口令为666
update login set pwd='666' where name='disen';
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
1.4、第三阶段 MySQL数据库
root数据库技术 一、数据库理论 1 什么是数据库技术 数据库技术主要研究如何组织、存储数据,并如何高效地提取和处理数据。 2 什么是SQL SQL(Structured Query Language)结构化查询语言 SQL是操作数据库的命令集,也是功能齐全的…...
![](https://img-blog.csdnimg.cn/bd54a3c7da84447aa12bb19f76a4004b.gif#pic_right)
LeetCode:202. 快乐数
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱202. 快乐数 题目描述:编写一个算法来判断一个数 n 是不是快…...
![](https://img-blog.csdnimg.cn/img_convert/c40aa3c57d493273e884ed9d8351e557.png)
Android 14 新功能之 HighLights:快速实现文本高亮~
日常开发中可能会遇到给 TextView 的全部或部分文本增加高亮效果的需求,以前可能是通过 Spannable 或者 Html 标签实现。 升级 Android 14 后就不用这么迂回了,因其首次引入直接设置高亮的 API:HighLights。需要留意的是 HighLights API 和 …...
![](https://img-blog.csdnimg.cn/img_convert/19030b9414e39dfe5060b4a6905a0963.png)
[渗透教程]-004-嗅探工具-Nmap
文章目录 Nmap介绍基本操作进阶操作Nmap介绍 nmap是一个网络扫描和主机检测工具,它可以帮助用户识别网络上的设备和服务。获取主机正在运行哪些服务,nmap支持多种扫描,UDP,TCP connect(),TCP SYN(半开扫描) ftp代理,反向标志,ICMP,FIN,ACK扫描,ftp代理,反向标志,ICMP. 可以用于…...
![](https://img-blog.csdnimg.cn/img_convert/aa561600c9ad4ba0a8bb8ce5cf766d84.png)
大数据技术之Hive SQL题库-初级
第一章环境准备1.1 建表语句hive>-- 创建学生表 DROP TABLE IF EXISTS student; create table if not exists student_info(stu_id string COMMENT 学生id,stu_name string COMMENT 学生姓名,birthday string COMMENT 出生日期,sex string COMMENT 性别 ) row format delim…...
![](https://www.ngui.cc/images/no-images.jpg)
常见HTTP状态码汇总
文章目录1xx: 信息2xx: 成功3xx: 重定向4xx: 客户端错误5xx: 服务器错误1xx: 信息 状态码描述100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。101 Switching Protocols服务器转换协议:服…...
![](https://img-blog.csdnimg.cn/f8b284a4e903400a9f74036e9221054b.jpeg#pic_center)
蓝桥杯刷题冲刺 | 倒计时15天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.年号字串2.裁纸刀3.猜生日1.年号字串 题目 链接: 年号字串 - 蓝桥云课 (lanqiao.c…...
![](https://img-blog.csdnimg.cn/3d0ac53c43d14721826a4ccadcb2f460.png)
【差分数组】
差分数组一维差分差分数组的作用差分矩阵结语一维差分 输入一个长度为 n 的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c ,请你输出进行完所有操作后的序列。 输入格式 第一行包含两个…...
![](https://img-blog.csdnimg.cn/d40c3394f9e54336a6de1ee30e771176.png)
2022年NOC软件创意编程(学而思)决赛小学高年级组scratch
2022NOC决赛图形化小高组 一、选择题 1.运行下面的程序,最终“我的变量”的值是多少? 2.希望定义一个函数如下,可以让角色旋转指定的圈数。里面空缺的地方填上什么数字比较合适? 3.运行程序,在舞台上可以看见几个角色 ? 4.运行程序,角色会依次说什么 ? 5.我们都知…...
![](https://img-blog.csdnimg.cn/36749ff38eba4343ace800a6f10f0049.png)
[JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]
目录 1.想法 2.框架的搭构 2.1图书 2.1.1Book类 2.1.2BookList类 2.2用户 2.2.1User抽象类 2.2.2AdminUser类(管理者) 2.2.3NormalUser 2.3操作 操作接口 借阅操作 删除操作 查询操作 归还图书 展示图书 退出系统 2.4小结 3.主函数的编…...
![](https://img-blog.csdnimg.cn/c3ca523dbcbc4f0088ddee528e91c7fb.jpeg)
大数据周会-本周学习内容总结07
目录 01【hadoop】 1.1【编写集群分发脚本xsync】 1.2【集群部署规划】 1.3【Hadoop集群启停脚本】 02【HDFS】 2.1【HDFS的API操作】 03【MapReduce】 3.1【P077- WordCount案例】 3.2【P097-自定义分区案例】 历史总结 01【hadoop】 1.1【编写集群分发脚本xsync】…...
![](https://img-blog.csdnimg.cn/b87d4af1470449cfbf85708edec2a46c.png#pic_center)
搭建一个双系统个人服务器
搭建一个双系统个人服务器0.前言一、双系统安装1.磁盘划分2.windows安装3.ubuntu安装二、系统启动项美化:1. refind引导2. 美化 grub 界面三、系统代理0.前言 年后找了份工作,忙于适应新环境所以更新也减缓了,最近闲暇时间给个人电脑进行了整…...
![](https://img-blog.csdnimg.cn/img_convert/edc2ae47e76d8fe0bea62a355d2af157.jpeg)
电脑长按电源键强行关机,对SSD有伤害吗?SSD 掉盘之殇
说到“按住电源键强制关机”的操作,想必大家都不会陌生,毕竟在电脑蓝屏或者电脑死机的时候,我们总是束手无策。而且,身边的人在遇到同样的情况时,往往都是选择长按电源键强制关机,所以当我们遇到同样的情况…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux:centos内核优化详解
一、系统内核部分设置在以下文件 vim /etc/sysctl.conf 1.禁用IPV6 net.ipv6.conf.all.disable_ipv6 1 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.default.disable_ipv6 1 net.ipv6.conf.lo.disable_ipv6 1 # 禁用某一个指定接口的IPv6(此处为:lo) 理想情况下,…...
![](https://img-blog.csdnimg.cn/9077a2fe205b48f5867e9907cc23a625.jpeg)
链表经典OJ题合集(包含带环问题,相交问题,随机指针复制等,附动画讲解)
目录 一:前言 二:简单题目 (1)移除链表元素 (2)反转链表 (3)找链表的中间结点 (4)输入一个链表,输出该链表中倒数第k个结点 (5)合并两个有序链表 (6)相交链表 (7)判断链表是否带环 三:较难题目 (1)链表分割 (2)判断链表是否为回…...
![](https://www.ngui.cc/images/no-images.jpg)
CSS新增
系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录什么是 CSS3渐进增强和优雅降级CSS3 中的选择器CSS3 中的背景CSS3 中的边框CSS3 中的文本效果CSS3 中的字体 font-face什么是 CSS3 CSS3是CSS(层叠样式表)技术的升级版…...
![](https://img-blog.csdnimg.cn/7490b15ca08845baa13c020daaa05356.png)
奇安信_防火墙部署_透明桥模式
奇安信_防火墙部署_透明桥模式一、预备知识二、项目场景三、拓扑图四、基本部署配置1. 登录web控制台2.连通性配置3.可信主机配置4.授权导入5.特征库升级6.安全配置文件五、透明桥配置1. 创建桥2. 端口绑定桥3. 创建桥端口六、结语一、预备知识 安全设备接入网络部署方式 二、…...
![](https://img-blog.csdnimg.cn/img_convert/07fb74f4b7355119ef45a6bca1094339.png)
C语言——字符串函数(2)和内存函数
(一)strtok函数dilimiters参数是个字符串,定义了用作分隔符的字符集合第一个参数指定一个字符串,它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回…...
![](https://www.ngui.cc/images/no-images.jpg)
第1节 线性回归模型
1. 模型概述 对于收集到的数据(xi,yi)(x_i,y_i)(xi,yi),建立线性回归模型yiθTxiεi(1)y_i\theta^{^T} x_i \varepsilon_i (1)yiθTxiεi(1) 需要估计的参数为θT\theta^{^T}θT,我们的目的是让估计的参数θT\theta^{^T}θT和xix_ixi…...
![](https://img-blog.csdnimg.cn/b0e46c4c10a745cf83bc069e85e0185c.png)
CodeGeeX 130亿参数大模型的调优笔记:比FasterTransformer更快的解决方案
0x0 背景 相信大家都使用或者听说过github copilot这个高效的代码生成工具。CodeGeeX类似于github copilot,是由清华大学,北京智源研究院,智谱AI等机构共同开发的一个拥有130亿参数的多编程语言代码生成预训练模型。它在vscode上也提供了插件…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux驱动之并发与竞争
文章目录并发与竞争的概念原子操作原子整形操作 API 函数原子位操作 API 函数自旋锁自旋锁简介自旋锁结构体自旋锁 API 函数自旋锁的注意事项读写自旋锁读写自旋锁的API顺序锁顺序锁的APIRCU(Read-Copy-Update)RCU的API信号量信号量API互斥体互斥体的API完成量(Completion)完成…...
![](https://img-blog.csdnimg.cn/img_convert/d4cd857d5cdf43dc94fb729097178160.png)
【密码学复习】第四讲分组密码(三)
AES算法的整体结构 AES算法的轮函数 1)字节代换(SubByte) 2)行移位(ShiftRow) 3)列混合(MixColumn) 4)密钥加(AddRoundKey)1-字节代换…...
![](https://img-blog.csdnimg.cn/img_convert/6ef37deaaa07acd3c3eb018b903f8c51.png)
JVM(内存划分,类加载,垃圾回收)
JVMJava程序,是一个名字为Java 的进程,这个进程就是所说的“JVM”1.内存区域划分JVM会先从操作系统这里申请一块内存空间,在这个基础上再把这个内存空间划分为几个小的区域在一个JVM进程中,堆和方法区只有一份;栈和程序…...
![](https://www.ngui.cc/images/no-images.jpg)
工作中遇到的问题 -- 你见过哪些写的特别好的代码
strPtr : uintptr((*(*stringStruct)(unsafe.Pointer(&str))).str)代码解析: 这是一段 Go 代码,它的作用是获取一个字符串变量 str 的底层指针,即字符串数据的起始地址。 这段代码涉及到了 Go 语言中的指针、类型转换和内存布局等概念&…...
![](https://www.ngui.cc/images/no-images.jpg)
基于chatGPT设计卷积神经网络
1. 简介 本文主要介绍基于chatGPT,设计一个针对骁龙855芯片设计的友好型神经网络。 提问->跑通总共花了5min左右,最终得到的网络在Cifar100数据集上与ResNet18的精度对比如下。 模型flopsparamstrain acc1/5test acc1/5ResNet18(timm)1.8211.18~98…...
![](https://www.ngui.cc/images/no-images.jpg)
java.sql.Date和java.util.Date的区别
参考答案 java.sql.Date 是 java.util.Date 的子类java.util.Date 是 JDK 中的日期类,精确到时、分、秒、毫秒java.sql.Date 与数据库 Date 相对应的一个类型,只有日期部分,时分秒都会设置为 0,如:2019-10-23 00:00:0…...
![](https://img-blog.csdnimg.cn/2b182def443e42f589e5fdb7d9fe91d2.png)
动态规划---线性dp和区间dp
动态规划(三) 目录动态规划(三)一:线性DP1.数字三角形1.1数字三角形题目1.2代码思路1.3代码实现(正序and倒序)2.最长上升子序列2.1最长上升子序列题目2.2代码思路2.3代码实现3.最长公共子序列3.1最长公共子序列题目3.2代码思路3.3代码实现4.石子合并4.1题目如下4.2代…...
![](https://www.ngui.cc/images/no-images.jpg)
常见的2D与3D碰撞检测算法
分离轴分离轴定理(Separating Axis Theorem)是用于解决2D或3D物体碰撞检测问题的一种方法。其基本思想是,如果两个物体未发生碰撞,那么可以找到一条分离轴(即一条直线或平面),两个物体在该轴上的…...
![](https://img-blog.csdnimg.cn/30da460621a241a88768b0a48393b815.png)
STM32 10个工程篇:1.IAP远程升级(二)
一直提醒自己要更新CSDN博客,但是确实这段时间到了一个项目的关键节点,杂七杂八的事情突然就一涌而至。STM32、FPGA下位机代码和对应Labview的IAP升级助手、波形设置助手上位机代码笔者已经调试通过,因为不想去水博客、凑数量,复制…...
![](https://img-blog.csdnimg.cn/img_convert/d875dec64ee8c8604bb3d80b64f98ff1.gif)
Unity+ChatGpt的联动 AICommand
果然爱是会消失的,对吗 chatGpt没出现之前起码还看人家的文章,现在都是随便你。 本着师夷长技以制夷的思路,既然打不过,那么我就加入 github地址:https://github.com/keijiro/AICommand 文档用chatGpt翻译如下&#…...
![](https://img-blog.csdnimg.cn/e957fcda5b5a4cbbb44f97b2d1bd0863.jpeg)
网站建设业务市场营销论文/广告投放价目表
目录 进化类算法 遗传算法 概述 特点 改进方向 算法流程 差分进化算法 概述 原理 特点 算法流程 免疫算法 概述 优点 算法流程 群智能算法 蚁群算法(ACO) 概述 特点 算法流程 改进的蚁群算法 粒子群算法(PSO) 概述 特点 算法流程 蝙蝠算法(Bat Algorithm,BA) 模拟退火算法 概述…...
![](/images/no-images.jpg)
健康服务管理中心/昆明网站seo优化
PHP三元运算符的使用方法技巧PHP是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用。下面是小编为大家搜索整理的PHP三元运算符的使用方法技巧,希望能给大家带来帮助…...
![](/images/no-images.jpg)
赣州市做网站设计/重庆网络推广
1、创建场景函数 var scenenew THREE.Scene();说明: 创建一个场景,所有的物体,容器都放在该场景中,并且只存在于一个唯一的场景。 2、创建相机函数 var cameranew THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeig…...
![](https://img-blog.csdnimg.cn/66a33d4f61884d37bca86e2a14c4e44b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yqq5Yqb5omR6IW-55qE5bCP6I-c6bif,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
网站开发中网页之间的连接形式/网络做推广公司
使用ansible中的playbookPlaybook的功能YAML简介特点语法简介Playbook的核心组件vim 设定技巧playbook执行命令练习Playbook的功能 playbook 是由一个或多个play组成的列表 playbook文件使用YAML来写的 YAML 简介 是一种表达资料序列的格式,类似XML Yet Another…...
![](https://img-blog.csdnimg.cn/img_convert/78fd487e12ab106d196b819679229958.png)
做网站建设的合同范本/做运营需要具备什么能力
无论人生低潮还是得意,或者是罗曼蒂克的时刻,都少不了一首适合当下情景的音乐,或许能将感情升华,也甚至可以改变很多事情的决定,所以一套好的汽车音响效果显得格外的重要。捷豹XJ改装讯图dsp音频处理器和大多数车型相比…...
![](/images/no-images.jpg)
视频分销网站建设/网站建设步骤流程详细介绍
一.问题11.需求:最近在用Vue写后台,其中有个需求被广泛使用:点击签收,立即变成 节点办理|办结2.解决办法:思路;在 节点办理|办结 两个button按钮上绑定v-if的三目运算,当点击签收,签收状…...