欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

撩课-Java每天5道面试题第11天

程序员文章站 2022-05-14 10:24:41
86.如何获得高效的数据库逻辑结构? 87.数据库三范式是什么? 88.SQL语句分为哪几种? 89. Delete、truncaate、drop都是删除语句,它们有什么分别? 90.Where和having都是条件筛选关键字,它们有什么分别? ......

86.如何获得高效的数据库逻辑结构?

从关系数据库的表中
删除冗余信息的过程
称为数据规范化,
是得到高效的关系型数据库表的逻辑结构
最好和最容易的方法。

规范化数据时应执行以下操作:
1.将数据库的结构精简为最简单的形式
2.从表中删除冗余值
3.标识所有依赖与其他数据的数据
规范化过程有几个阶段,
分别称作第一范式(1nf)、
第二范式(2nf)、
第三范式(3nf)、
第四范式(4nf)
以及第五范式(5nf)。
对于所有的实际应用,
3nf已经足够了。

 

87.数据库三范式是什么?

第一范式(1nf):
字段具有原子性,不可再分。
所有关系型数据库系统
都满足第一范式)

数据库表中的字段都是单一属性的,
不可再分。
例如,姓名字段,
其中的姓和名必须作为一个整体,
无法区分哪部分是姓,
哪部分是名,
如果要区分出姓和名,
必须设计成两个独立的字段。


第二范式(2nf):
第二范式(2nf)是在第一范式(1nf)的基础上
建立起来的,即满足第二范式(2nf)
必须先满足第一范式(1nf)。

要求数据库表中的每个实例
或行必须可以被惟一地区分。
通常需要为表加上一个列,
以存储各个实例的惟一标识。
这个惟一属性列被
称为主关键字或主键。

 
第二范式(2nf)要求实体的属性
完全依赖于主关键字。
所谓完全依赖是指不能存在
仅依赖主关键字一部分的属性,
如果存在,
那么这个属性和主关键字的这一部分
应该分离出来形成一个新的实体,
新实体与原实体之间是一对多的关系。
为实现区分通常需要为表加上一个列,
以存储各个实例的惟一标识。
简而言之,
第二范式就是非主属性
非部分依赖于主关键字。


第三范式(3nf)
是在第二范式的基础上建立起来的,
即满足第三范式(3nf)
必须先满足第二范式(2nf)。

第三范式(3nf)要求
非主关键字不能依赖于
其他非主关键字。
即非主关键字之间
不能有函数(传递)依赖关系.
即不能从一个表的某个字段
推出该表的另一个字段。 

满足三范式的设计,
基本可以解决数据冗余、
插入异常、
更新异常、
删除异常等数据存储问题。

 

88.sql语句分为哪几种?

sql语句主要可以划分为以下几类:

ddl(data definition language):
数据定义语言,
定义对数据库对象(库、表、列、索引)的操作。
包括:
create、
drop、
alter、
rename、
truncate等

dml(data manipulation language): 
数据操作语言,
定义对数据库记录的操作。
包括:
insert、
delete、
update、
select等

dcl(data control language): 
数据控制语言,
定义对数据库、表、字段、
用户的访问权限和安全级别。

包括:
grant、
revoke等

transaction control:
事务控制
包括:
commit、
rollback、
savepoint等

 

89. delete、truncaate、drop都是删除语句,它们有什么分别?

delete 属于dml语句,
删除数据,
保留表结构,
需要commit,
可以回滚,
如果数据量大,
很慢。

truncate 属于ddl语句,
删除所有数据,
保留表结构,
自动commit,
不可以回滚,
一次全部删除所有数据,
速度相对较快。

drop属于 ddl语句,
删除数据和表结构,
不需要commit,
删除速度最快。

 

90.where和having都是条件筛选关键字,它们有什么分别?

1.where语句是一条一条从磁盘读取的,
 然后进行判断,
满足条件的存放到内存,
不满足忽略,
而having是将所有的数据读入内存中,
然后在内存内部逐条判断,
不满足直接删除
where是判断数据从磁盘
读入内存的时候,
having是判断分组
统计之前的所有条件

2.having子句中可以使用字段别名,
而where不能使用

3.having能够使用统计函数,
但是where不能使用

4.where 后不能跟聚合函数,
因为where执行顺序大于聚合函数。

5.having 是筛选组  
而where是筛选记录
注意:having用于应被用于where子句的条目,
从我们开头的2条语句来看,
这样用并没有出错,
但是mysql不推荐。
而且也没有明确说明原因,
但是既然它要求,
我们遵循就可以了