数据库+加密算法参考材料-2023.3.29
数据库
1.char和varchar的区别:
char是固定长度的,char(10)无论实际存储多少内容.该字段都占用10个字符。
varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用
了多长的空间
建议:在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar.例如存储用户MD5加密后的密码,则应该使用char。
1.varchar(10)和int(10)代表什么含义?
varchar(10)表示可以存储的数据的最大长度,不足的话,不会补0
int(10)表示展示的长度,不足10位以0填充
1.三范式(常考)
第一范式: 每个列都不可再拆分.
第二范式: 非主键列完全依赖于主键,而不能是依赖于主键的一部分.
第三范式: 满足第二范式的前提下,不能出现传递依赖。
某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。将一个实体信息的数据放在一个表内实现。
1.事务的四大特性:ACID(常考)
原子性,一致性,隔离性,持久性
A=Atomicity
原子性:就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.
C=Consistency
一致性:系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.
I=Isolation
隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何 其他事务
D=Durability
持久性:一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果
1.事务回滚机制
事务回滚是指将该事务已经完成的对数据库的更新操作撤销。要同时修改数据库中两个不同表时, 如果它们不是一个事务的话, 当第一个表修改完, 可能第二个表修改过程中出现了异常而没能修改, 此时就只有第二个表依旧是未修改之前的状态, 而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候, 当第一个表修改完, 第二表修改出现异常而没能修改, 第一个表和第二个表都要回到未修改的状态, 这就是所谓的事务回滚
1.并发带来的问题(常考)
脏读:第一个事务读取并修改数据,但是还没有提交,第二个事务读取了这个数据。但是第一个事务回滚了修改的数据,导致第二个数据读取了脏数据
丢失修改:一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
不可重复读(因为修改数据导致读取数据不一样):在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(因为增减数据导致读取数据不一样):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
1.mysql的四种事务隔离级别(spring的隔离级别比mysql多了default隔离级别,常考)
事务隔离级别 问题
未提交读 会产生脏读
已提交读 解决了脏读,但是会产生不可重复读的问题
可重复读 可以解决大部分问题,会产生幻读
可串行化 这是最高的隔离级别,性能太慢
未提交读:其他事务可以看到本事务没有提交的部分修改.因此会造成脏读的问题(读取到了其他事务未提交的部分,而之后该事务进行了回滚)
已提交读:只能读取到本事务已经提交的部分.这个隔离级别有 不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟然不一样,因为另外一个事务对数据进行了修改。
可重复读(大部分解决办法):解决了上面不可重复读的问题(看名字也知道),但是仍然有一个新问题,就是 幻读,当你读取id> 10 的数据行时,对涉及到的所有行加上了读锁,此时例外一个事务新插入了一条id=11的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11的数据,而上次的查询操作并没有获取到,再进行插入就会有主键冲突的问题。InnoDB默认使用的是可重复读隔离级别
可串行化:这是最高的隔离级别,可以解决上面提到的所有问题,因为他强制将所有的操作串行执行,这会导致并发性能极速下降,因此也不是很常用.
1.mysql有几种锁(按照从大到小的顺序)
1、表级锁: 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高, 并发度最低。
2、页面锁: 开销和加锁时间介于表锁和行锁之间; 会出现死锁; 锁定粒度介于表锁和行锁之间, 并发度一般
3、行级锁: 开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低, 并发度也最
高。
1.sql基础
1)按照 where->group by分组->having->order by 的执行顺序。
2)Group by 默认排序是asc升序.
3)group by 和having的作用
先group by,将数据分组,然后having基于上述分组对数据进行筛选,此时不能用where,因为原表中不存在某一条数据。
4)having和where的区别
作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组
WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)
5)子查询
https://blog.csdn.net/wpc2018/article/details/122948692
/* 子查询 */ ------------------
- 子查询需用括号包裹。
– from型
from后要求是一个表,必须给子查询结果取个别名。 - 简化每个查询内的条件。
- from型需将结果生成一个临时表格,可用以原表的锁定的释放。
- 子查询返回一个表,表型子查询。
select * from (select * from tb where id>0) as subfrom where id>1;
– where型 - 子查询返回一个值,标量子查询。
- 不需要给子查询取别名。
- where子查询内的表,不能直接用以更新。
select * from tb where money = (select max(money) from tb);
– 列子查询
如果子查询结果返回的是一列。
使用 in 或 not in 完成查询
exists 和 not exists 条件
如果子查询返回数据,则返回1或0。常用于判断条件。
select column1 from t1 where exists (select * from t2);
– 行子查询
查询条件是一个行。
select * from t1 where (id, gender) in (select id, gender from t2);
行构造符:(col1, col2, …) 或 ROW(col1, col2, …)
行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。
– 特殊运算符
!= all()
= some()
!= some() 相当于 not in
相当于 in。any 是 some 的别名
不等同于 not in,不等于其中某一个。
6)左连接与右连接
– 左外连接 left join
如果数据不存在,左表有数据,右表用null填充
– 右外连接 right join
如果数据不存在,右表有数据,而左表用null填充
7)mysql的limit,第一个参数表示从xx开始,第二个参数是获取n条数据
1.SQl 题目:《100IT名企167题~185题》
2.Union 和union all的区别
UNION 在进行表链接后会筛选掉重复的记录,
Union all只是简单的将两个结果合并后就返回,不会去重。
从效率来说,union all更快,因此如果合并的表没有重复数据,那么用union all
1.分页语句
–取出 sql 表中第 31 到 40 的记录(以自动增长 ID 为主键)
mysql 方案: select * from t order by id limit 30,10
oracle 方案: select * from (select rownum r,* from t where r<=40) where r>30
1.statement与prepareStatement的区别
Statement用sql语句拼接,有sql注入的风险,并且执行效率低
prepareStatement用?的形式代替传入参数的形式,后面用set对?进行赋值,没有SQL注入风险
PreparedStatement是CallableStatement的父接口
1.主键和外键
SQL的主键表示唯一标识一条记录,不能有重复的,不允许为空。例如:一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
SQL的外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。外键与主键相对,作用就是通过主外键的之间关系使对张表中的数据更好的关联。
区别:
主键——一个表主键只能有一个
外键——一个表可以有多个外键
作用
主键——用来保证数据完整性
外键——用来和其他表建立联系用的
举例:
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
比如:
学生表(学号,姓名,性别,班级),其中每个学生的学号是唯一的,学号就是一个主键;
课程表(课程编号,课程名,学分),其中课程编号是唯一的,课程编号就是一个主键;
成绩表(学号,课程号,成绩),成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。(必须是属性组,一个表只能有一个主键)
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。
主键和外键的创建
主键:
主键一般在建表的时候会默认设置为 primary key,例如
create table students (
StudentNo int PRIMARY KEY IDENTITY(1,1), --加主键约束,还有标识列属性(两者构成实体完整性)
StudentName nvarchar(15) not null, --加非空约束,不加"not null" 默认为:可以为空
StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)
)
在上述的表的创建过程中,我们直接将StudentNo设置为主键了。
但有时候我们在建表的时候忘记设置主键,之后也是可以在这个表的后边补上。例如:
alter table 表名
add constraint 字段名 primary key ;
外键:
我们也可以用类似的方法进行外键的添加:
alter table 表名
add constraint 字段名
foreign key (字段名) references 关联的表名(关联的字段名); --注意’关联的表名’和’关联的字段名’
1.all和any的区别
ALL:是所有,表示全部都满足才返回true
ANY/SOME:是任意一个 ,表示有任何一个满足就返回true
1.数据定义语言(DDL)、数据查询语言(DQL)、数据操纵语言(DML)、数据控制语言(DCL)
SQL语言的组成部分有:数据定义语言(DDL)、数据处理语言(DML)、数据控制语言(DCL)、数据库事务。数据字典是关于数据库中数据的描述,是元数据,而不是数据本身。
DDL全称是Data Definition Language,即数据定义语言.由CREATE、ALTER、DROP和TRUNCATE四个语法组成。DDL是table+表名
–创建表
create table 表名称(字段1 类型,字段2 类型); //在一个数据库中创建一个表
create table hero_table ( id int,name varchar(10)); //创建表
//创建表并增加约束
CREATE TABLE 表名称 (
字段1 类型1 约束1 约束1,
字段2 类型2 约束2 约束2
);
//创建表并增加约束
CREATE TABLE hero_table4 (
id INT(11) NOT NULL PRIMARY KEY,
NAME VARCHAR(10) NOT NULL UNIQUE KEY
)
1.添加字段
ALTER TABLE 表名称 ADD 字段名 字段约束
ALTER TABLE 表名称 ADD COLUMN 字段名 字段约束
2、添加索引
ALTER TABLE 表名称 ADD INDEX 索引名称 (字段名)
3、添加主键
ALTER TABLE 表名称 ADD PRIMARY KEY (字段名)
ALTER TABLE 表名称 ADD UNIQUE KEY (字段名)
4、添加外键约束
ALTER TABLE 需要添加外键表名称 ADD FOREIGN KEY 外键名(设为外键的字段) REFERENCES 被添加外键表名称(设为被添加外键的字段)
DROP TABLE 表名称
数据操纵语言(DML)全称是Data Manipulation Language。主要由:insert、update、delete语法组成。有表名
–增加数据
insert into person(id,name,age,phone,address) values (1,‘ayan’,22,‘123232323’,‘中国上海’);
insert into person values (1,‘ayan’,22,‘123232323’,‘中国上海’);
–删除数据
delete from person where id = 1;
–修改数据
update person set address=‘浙江杭州’ where id = 1;
数据查询语言(DQL) select。
数据控制语言:Data Control Language。常见的授权、取消授权、回滚、提交等等操作。
grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’;
revoke 权限列表 on 数据库名.表名 from ‘用户名’@‘主机名’;
1.关于count函数的说明
count()和count(1)不会忽略为空的行
count(列明)会忽略为空的行
1)count()包括了所有列,相当于行数,在统计结果的时候,不会忽略某些列值为NULL的行。
2)count(1)用1代表代码行,忽略所有列的值,在统计结果的时候,统计所有行,效果同count(*)。
3)count(列名)只包括列名对应一列,在统计结果的时候,会忽略列值为空的行。
1.SQL 中的大小写转换函数
Ucase,大写
Lcase,小写
1.sql中的正则表达式
^ 该符号表示匹配输入字符串的开头;
KaTeX parse error: Unexpected character: '' at position 15: 表示匹配输入字符串的结尾; ̲[...] 表示匹配所包含的任…’;
现要选取居住地址Address不以’C’或’O’开头的人员信息,下列MySQL查询语句正确的是:
SELECT * FROM Person Address REGEXP ‘[CO]’;
INSERT INTO 语句用于向一张表中插入新的行。
SELECT INTO 语句从一张表中选取数据插入到另一张表中。常用于创建表的备份复件或者用于对记录进行存档。
select * into 新表 from 旧表 where distance>500;
Redis
1.概念
本质上是一个 Key-Value 类型的内存数据库,整个数据库先统统加载在内存当中进行操作,然后定期通过异步操作把数据库数据 flush 到硬盘上进行保存。Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上
1.redis的好处
高并发:直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
高性能:将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
1.Redis 与 memcached 相比有哪些优势
1.为什么 Redis 需要把所有数据放到内存中
Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。
所以 redis 具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。
1.通过串行化,保证数据库和内存中Redis的数据保持一致
2.redis管道的作用:一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
Java web
1.forward 和 redirect 的区别
foraward仅是容器中控制权的转向, 在客户端浏览器地址栏中不会显示出转向后的地址。是服务器请求资源, 服务器直接访问目标地址的 URL, 把那个 URL 的响应内容读取过来, 然后把这些内容再发给浏览器, 浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect则是完全的跳转, 浏览器将会得到跳转的地址, 并重新发送请求链接。 这样, 从浏览器的
地址栏中可以看到跳转后的链接地址。 就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址, 一般来说浏览器会用刚才请求的所有参数重新请求, 所以 session,request 参数都可以获取。
设计模式
https://www.runoob.com/design-pattern/design-pattern-tutorial.html
加密算法
https://blog.csdn.net/jushisi/article/details/108049369
对称性加密算法有:AES、DES、3DES,
对称加密最后一个字母是s,standard(标准)
用途:对称加密算法用来对敏感数据等信息进行加密
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;AES是一个使用128为分组块的分组加密算法,分组块和128、192或256位的密钥一起作为输入,对4×4的字节数组上进行操作。众所周知,AES是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。
流加密:RC4,采用每位异或的形式。
非对称性算法有:RSA、DSA、ECC。
是算法,因此最后一个字母是A,Algorithm
A发给B数据,要使用对方B的公钥进行加密,然后B用私钥进行解密
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,是第一个实用的,最广的公钥密码体制。PGP加密是基于RSA公钥加密的邮件加密软件,需要加密的文件块的长度也是可变的。RSA在国外早已进入实用阶段,已研制出多种高速的RSA的专用芯片。
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法。
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。ECC和RSA相比,具有多方面的绝对优势,主要有:抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
散列算法(签名算法)有:MD5、SHA1、HMAC
用途:主要用于验证,防止信息被修。具体用途如:文件校验、数字签名、鉴权协议
MD5:MD5是一种不可逆的加密算法,不可用于文本加密(因为文本既要加密也要解密),主循环有8轮,512位来处理输入文本,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。
SHA1:是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。而SHA-1基于MD5,MD5又基于MD4。
HMAC:是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC是需要一个密钥的。所以,HMAC_SHA1也是需要一个密钥的,而SHA1不需要。
CRC:(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产生一个4字节(32位)的校验值,一般是以8位十六进制数,如FA 12 CD 45等。CRC算法的优点在于简便、速度快,严格的来说,CRC更应该被称为数据校验算法,但其功能与数据摘要算法类似,因此也作为测试的可选算法。