数据库与MySQL
📋 本文节选自《Java常见面试题 8000 道》,返回 查看全部章节
162、数据库的三范式是什么?
1、 列不可再分;
2、 每一行数据只做一件事,只与一列相关,主键;
3、 每个属性都与主键有直接关系,而不是间接关系;
三大范式只是设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情结,当然要特殊对待,数据库设计最重要的是看需求和性能,需求>性能>表结构。
所以不能一味的追求三范式建立数据库。
163、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
一般情况下,我们创建的表类型是InnoDB。
不重启MySQL,如果新增一条记录,id是8;
重启,ID是6;因为InnoDB表只把自增主键的最大ID记录在内存中,如果重启,已删除的最大ID会丢失。
如果表类型是MyISAM,重启之后,最大ID也不会丢失,ID是8;
InnoDB必须有主键(建议使用自增主键,不用UUID,自增主键索引查询效率高)、支持外键、支持事务、支持行级锁。
系统崩溃后,MyISAM很难恢复;
综合考虑,优先选择InnoDB,MySQL默认也是InnoDB。
164、如何获取当前数据库版本?
//MySQL,,mysql -v
select version();
//Oracle
select * from v$version;165、说一下 ACID 是什么?
ACID是数据库事务执行的四大基本要素,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
1、 原子性;
整个事务中的所有操作,要么全部完成,要不全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被roolback回滚到事务开始前的状态,就像这个事务从未执行过一样。
2、 一致性;
事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
3、 隔离性;
隔离状态执行事务,使他们好像是系统在给定时间内执行的唯一操作。
如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性确保每一个事务在系统中认为只有自己在使用系统。这种属性称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
4、 持久性;
一个成功的事务将永久的改变系统的状态。
166、char 和 varchar 的区别是什么?
1、 char的长度是固定的,varchar的长度的可变的;
2、 char的效率比varchar的效率高;
3、 char占用空间比varchar大,char在查询时需要使用trim;
167、float 和 double 的区别是什么?
1、 float和double的区别是什么?;
(1)内存中占有的字节数不同
单精度浮点数在内存中占有4个字节;
双精度浮点数在内存中占有10个字节;
(2)有效数字位数不同
单精度浮点数有效数字8位;
双精度浮点数有效数字16位;
(3)数值取值范围不同
单精度浮点数的表示范围:-3.40E+38~3.40E+38
双精度浮点数的表示范围:-1.79E+308~-1.79E+308
(4)在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比双精度浮点数的速度快
如果不声明,默认小数是double类型,如果想用float,要进行强转;
2、 例如;
float f = 1.3;会编译报错,正确的写法是float f = (float)1.3;或者float a = 1.3f;(f或F都可以不区分大小写)
3、 注意;
float是八位有效数字,第七位会四舍五入;
4、 面试题;
(1)java中3*0.1==0.3将会返回什么?true还是false?
答:返回false,因为浮点数不能完全精确的表示出来,一般会损失精度;
(2)java中float f = 3.4;是否正确?
答:不正确。因为3.4是双精度浮点数,将双精度赋给单精度属于向下转型,会造成精度损失,因此需要强制类型转换float=(float)3.4;或者写成float f = 3.4f;
168、Oracle分页sql
#不带排序的
SELECT * FROM (
SELECT ROWNUM AS rowno, t.* FROM worker t where ROWNUM <=20) table_alias
WHERE table_alias.rowno > 10;#带排序的
SELECT * FROM (
SELECT tt.*, ROWNUM AS rowno FROM (
SELECT t.* FROM worker t ORDER BY wkid aSC) tt WHERE ROWNUM <= 20) table_alias
WHERE table_alias.rowno >= 10;169、数据库如何保证主键唯一性
1、 主键约束;
主键列上没有任何两行具有相同值(即重复值),不允许空(NULL);
2、 唯一性约束;
保证一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一性约束允许为null,但是只能有一行;
3、 唯一性索引;
不允许具有索引值相同的行,从而禁止重复的索引和键值;
4、 三者的区别;
- 约束是用来检查数据的正确性;
- 索引是用来优化查询的;
- 创建唯一性约束会创建一个约束和一个唯一性索引;
- 创建唯一性索引只会创建一个唯一性索引;
- 主键约束和唯一性约束都会创建一个唯一性索引。
170、如何设计数据库
1、 数据库设计最起码要占用这个项目开发的40%以上的时间;
2、 数据库设计不仅仅停留在页面demo的表面;
页面内容所需字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。
3、 数据库设计完成后,项目80%的设计开发都要存在你的脑海中;
每个字段的设计都要有他存在的意义,要清楚的知道程序中如何去运用这些字段,多张表的联系在程序中是如何体现的。
4、 数据库设计时就要考虑效率和优化问题;
数据量大的表示粗粒度的,会冗余一些必要字段,达到用最少的表,最弱的表关系去存储海量的数据。大数据的表要建立索引,方便查询。对于含有计算、数据交互、统计这类需求时,还有考虑是否有必要采用存储过程。
5、 添加必要的冗余字段;
像创建时间、修改时间、操作用户IP、备注这些字段,在每张表中最好都有,一些冗余的字段便于日后维护、分析、拓展而添加。
6、 设计合理的表关联;
若两张表之间的关系复杂,建议采用第三张映射表来关联维护两张表之间的关系,以降低表之间的直接耦合度。
7、 设计表时不加主外键等约束关联,系统编码阶段完成后再添加约束性关联;
8、 选择合适的主键生成策略;
数据库的设计难度其实比单纯的技术实现难很多,他充分体现了一个人的全局设计能力和掌控能力,最后说一句,数据库设计,很重要,很复杂。
171、性别是否适合做索引
区分度不高的字段不适合做索引,因为索引页是需要有开销的,需要存储的,不过这类字段可以做联合索引的一部分。
172、如何查询重复的数据
1、 查询重复的单个字段(groupby);
select 重复字段A, count(*) from 表 group by 重复字段A having count(*) > 12、 查询重复的多个字段(groupby);
select 重复字段A, 重复字段B, count(*) from 表 group by 重复字段A, 重复字段B having count(*) > 1173、数据库一般会采取什么样的优化方法?
1、 选取适合的字段属性;
- 为了获取更好的性能,可以将表中的字段宽度设得尽可能小。
- 尽量把字段设置成not null
- 执行查询的时候,数据库不用去比较null值。
- 对某些省份或者性别字段,将他们定义为enum类型,enum类型被当做数值型数据来处理,而数值型数据被处理起来的速度要比文本类型块很多。
2、 使用join连接代替子查询;
3、 使用联合union来代替手动创建的临时表;
注意:union用法中,两个select语句的字段类型要匹配,而且字段个数要相同。
4、 事务;
要么都成功,要么都失败。
可以保证数据库中数据的一致性和完整性。事务以begin开始,commit关键字结束。
如果出错,rollback命令可以将数据库恢复到begin开始之前的状态。
事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方式为用户提供一种安全的访问方式,这样就可以保证用户的操作不被其他的用户干扰。
5、 锁定表;
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在大应用中。
由于在事务执行的过程中,数据库会被锁定,因此其它用户只能暂时等待直到事务结束。
有的时候可以用锁定表的方法来获得更好的性能,
共享锁:其它用户只能看,不能修改
lock table person in share mode;
对于通过lock table 命令主动添加的锁来说,如果要释放它们,只需发出rollback命令即可。
6、 使用外键;
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性,这个时候可以使用外键。
7、 使用索引;
索引是提高数据库查询速度的常用方法,尤其是查询语句中包含max()、min()、order by这些命令的时候,性能提高更为显著。
一般来说索引应该建在常用于join、where、order by的字段上。尽量不要对数据库中含有大量重复的值得字段建立索引。
8、 优化的查询语句;
在索引的字段上尽量不要使用函数进行操作。
尽量不要使用like关键字和通配符,这样做法很简单,但却是以牺牲性能为代价的。
避免在查询中进行自动类型转换,因为类型转换也会使索引失效。
174、索引怎么定义,分哪几种
1、 b-tree索引,如果不建立索引的情况下,oracle就自动给每一列都加一个B树索引;;
2、 normal:普通索引;
3、 unique:唯一索引;
4、 bitmap:位图索引,位图索引特定于只有几个枚举值的情况,比如性别字段;
5、 基于函数的索引;
175、mysql 的内连接、左连接、右连接有什么区别?
1、 内连接,显示两个表中有联系的所有数据;;
2、 左链接,以左表为参照,显示所有数据,右表中没有则以null显示;
3、 右链接,以右表为参照显示数据,,左表中没有则以null显示;