数据库面试题(实时更新)
1.基本关系中不同的列不能出自同一个域.(错误)
解析:
数据库中的域(域完整性):
域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值.。
比如学生表(学号,班号,年龄),班号和年龄这两条不同的列就可以出自同一“域”。
2.数据库的三级模式:
3.在DDBS中,数据传输量是衡量查询时间的一个主要指标,导致数据传输量大的主要原因是( 不同场地间的级联操作)。
解析:
DDBS:分布式数据库系统
了解什么是分布式系统:https://blog.csdn.net/tianlesoftware/article/details/5465765
4.(窗体)是连接用户和表之间的纽带,以交互窗口方式表达表中的数据。
解析:
窗体是一种文档,可以用来收集信息。它包括两部分,一部分是由窗体设计者输入的,填写窗体的人无法更改的文字或图形。窗体设计者可以插入希望得到回答的问题、选项列表、信息表格等。另一部分是由窗体填写者输入的,用于从填写窗体者处收集信息并进行整理的空白区域。窗体设计者可以在文档中插入窗体域或 ActiveX 控件,为窗体填写者提供用于收集数据的位置。
5.若要删除 book 表中的所有数据,如下哪些语法是错误的?(AD)
A drop table book;
B truncate table book;
C delete from book;
D del *from book;
解析:
A: drop table book 是删除整个表,题目的潜在意思是删除表中的数据而并非删除整个表。因此A错。
B: truncate table book 是删除表中的数据,删除速度比delete更快,无法撤回(回退),空间直接清理了。
C: delete from book 删除数据表中的数据,可以回退,可添加where 子句。
D:语法错误。不能用del
6.什么是存储过程,有哪些优缺点?
存储过程就是一段SQL语句的预编译集合,一段程序代码,其实说白了存储过程就是存储在数据库中的一个程序,该程序包含了一些SQL语句,主要是完成某一个SQL语句操作,这就类似于编程语言中的函数,存储过程中的名称就是函数名,存储过程内部的语句就是函数体,同样的可以被重复调用.
存储过程的优点:
- 重复使用:从而减少数据库开发人员的工作量。
- 减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
- 安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant,Deny,Revoke权限应用于存储过程。
- 效率高:由于数据库执行动作时,是先编译后执行的,然而存储过程是一个编译过得代码块,所以执行效率要比T-SQL语句高。
存储过程的缺点:
- 调试麻烦。
- 移植性差:不用的数据库支持的语言不一样,其存储过程的编写规则也不一样,所以存储过程无法抑制到另一类数据库。
- 不能大量使用:如果一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是非常难,而且代价是空前的,维护起来更麻烦
7.数据库的三个范式是什么?
范式是关系型数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。通常所用到的只是前三个范式,几第一范式,第二范式,第三范式。
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库的冗余越小。
第一范式:
强调的是列的原子性,即列不能再分成其他几列。
在一个关系型数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式。
第二范式:
在第一范式的基础上,满足两个条件,一是表必须有一个主键,二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
所谓完全依赖是指不能存在仅仅依赖主键一部分的属性,加入主键是由两个属性组成的,那么就是依赖这两个属性存在,不能只依赖其中一个。
简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
第三范式:
在第一第二范式的基础上,消除传递依赖。
第二范式和第三范式的区别:
2NF:非主键列是否完全依赖于主键
3NF:非主键列之间互不依赖
8.什么是视图,视图的使用场景有哪些
视图即虚拟表,也称为派生表,因为他们的内容都派生自其它表的查询结果,虽然视图看起来感觉和基本表一样,但是他们不是基本表,基本表的内容是持久的,而视图的内容是在使用过程中动态产生的。
- (1)视图是一种虚表
- (2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
- (3)向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句
- (4)视图向用户提供基表数据的另一种表现形式
- (5)视图没有存储真正的数据,真正的数据还是存储在基表中
- (6)程序员虽然操作的是视图,但最终视图还会转成操作基表
- (7)一个基表可以有0个或多个视图
视图的用途:
- 简化sql查询,提高开发效率
- 视图可以使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图可以对机密数据提供安全保护
视图的使用场景:
- 计算列的需要。数据库设计范式要求我们减少冗余字段,因此现在很多数据表都没有计算列字段,比如价格,数量,税率,含税金额等等。
- 不同表字段的聚合,信息重组。经销商通常有业务员,业务员通常有上下级关系(客户经理、区域经理、大区经理等),因此查看经销商业务员时我们需要看到直管业务员是谁?该业务员对应的区域经理、大区经理是谁(可能NULL)?因此我们可以联合经销商表、业务员信息表、业务员上下级关系表定义一个经销商视图。
- 安全性需要,主要是早期遗留系统集成需要。如:需要xx系统数据,又没接口,怎么办?直接操作数据库,这时就涉及数据安全性,合理利用视图则可以减少很多授权工作和保证数据安全性。当下新构建的系统几乎都是暴露api接口,因此数据安全性更多关注在接口的身份认证和数据粒度方面。
- 兼容老的数据表。
9.什么是索引,索引的作用以及优缺点?
索引是一种快速查询表中内容的机制,类似于目录。
索引运用在表中的某个些字段上,但存储时,独立于表之外。
索引的特点:
- 索引一旦建立,oracle系统就会对其进行自动维护,而且由oracle系统决定何时使用索引。
- 用户不用在查询语句中指定使用哪个索引。
- 在定义主键和唯一约束后,系统自动在相应的列上创建索引。
- 用户也可以按照自己的需求,对指定单个字段或多个字段添加索引。
什么时候创建索引:
- 表经常进行select操作的
- 表很大,记录内容分布范围很广
- 列名经常在where子句或连接条件中出现
什么时候不要创建索引:
- 表经常进行insert/update/delete操作
- 表很小(记录很少)
- 列名不经常作为连接条件或出现在where子句中
索引的优缺点:
- 加快了数据库的检索速度
- 降低了插入,删除,修改等维护任务的速度(虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引)
- 唯一索引可以确保每一行数据的唯一性,通过使用索引,可以在查询过程中使用优化隐藏器,提高系统的性能。
- 索引需要占用物理和数据空间。
10.什么是事务?
事务是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
举个例子:
银行转账工作,从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。
事务的特性:
- 原子性:一个事务要被完全的无二义性的做完或撤销,在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须全部撤销,数据应被回滚到以前的状态。
- 一致性:一个事务应该保持所有定义在数据上的不变的属性,意思就是一个事务应该把系统从一个一致状态转换到另一个一致状态。保持数据的完整性约束(完整性约束:为了防止不符合规范的数据进入数据库,在用户对数据进行插入,修改,删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确,有效,相容)
- 隔离性:在同一环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。
- 持久性:一个被完成的事务的效果应该是持久的
11.数据库的乐观锁和悲观锁
乐观锁:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用CAS算法和版本号机制实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其他线程阻塞,用完再把资源转让给其他线程),传统的关系型数据库里边就会用到很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前上锁。
两种锁的使用场景:
乐观锁适用于写比较少的情况下(多读场景),也就是冲突很少发生的时候,这样可以省去锁的开销,加大系统的整个吞吐量。
但是多写的情况下,一把会经常产生冲突,这就会导致上层应用不断的进行重试,这样反倒降低了性能,所以一般在多写的场景下使用悲观锁就比较合适。
12.超键,候选键,主键,外键的区别
超键:在关系中能唯一标识元组的属性集称为关系模式的超键
候选键:不含有多余属性的超键称为候选键(候选键是最小的超键)
主键:用户选做元组标识的一个候选键称为主键
外键:在一个表中存在的另一个表的主键称为外键
举个例子:
假设有如下两个表:
学生(学号,姓名,性别,身份证号,教师编号)
教师(教师编号,姓名,工资)
超键:
由超键的定义可知,学生表中含有学号或者身份证号的任意组合都为此表的超键。如:(学号)、(学号,姓名)、(身份证号,性别)等。
候选键:
候选键属于超键,它是最小的超键,就是说如果再去掉候选键中的任何一个属性它就不再是超键了。学生表中的候选键为:(学号)、(身份证号)。
主键:
主键就是候选键里面的一个,是人为规定的,例如学生表中,我们通常会让“学号”做主键,教师表中让“教师编号”做主键。
外键:
外键比较简单,学生表中的外键就是“教师编号”。外键主要是用来描述两个表的关系。