复试面试-数据库面试题
将网上常见的数据库面试题整理一下,方便自己和有需要的人学习。
1.事务
概念:访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成,满足ACID特性。
2.ACID特性
原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。
隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
注:事务的ACID特性是由关系数据库系统(DBMS)来实现的,DBMS采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所作的更新,如果某个事务在执行过程中发生错误,就可以根据日志撤销事务对数据库已做的更新,使得数据库回滚到执行事务前的初始状态。
单用户对数据库的串行操作并不会有隔离的问题,但当多用户并发对数据库进行操作时就会有并发一致性问题(读者可以思考一下不同的读写操作可能会引起哪几种不同的并发问题),这是致命的,所以必须满足事务的隔离性。DBMS是采用锁机制来实现事务的隔离性的。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。(可以结合操作系统中的同步互斥问题一起学习)。
3.数据库的3级模式
- 外模式:外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。
- 概念模式:又称模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。
- 内模式:又称存储模式,对应于物理级。它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。
注:数据库一旦被定义好,内模式和概念模式就是唯一确定的,但建立在数据库系统之上的应用则是非常广泛、多样的,所以对应的外模式不是唯一的,也不可能是唯一的。
4.视图
- 视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。 - 视图技术在数据库设计中很有用,可以提高用户操作的效率,也能提高数据库的安全性。
5.数据库中的各种键(码)
数据库中的键(key)也可以称为码,是关系模型中的一个重要概念,它是逻辑结构,不是数据库的物理结构。
在一个关系(就是表)中,存在一个或多个属性(表中的列),可以在这个关系中将每个元组(表中的行)唯一标识,这个或这些属性就是键(码),又细分为:
- 超键:能唯一标识元组的属性(集),一个属性可以为作为一个超键,多个属性组合也可以作为一个超键。
- 候选键:候选键有两个要求:1.始终能够确保在关系中能唯一标识元组。2.在属性集中找不出真子集能够满足条件。
其中第一个条件就是超键的标准,所以我们可以把候选键理解为不能再“缩小”的超键,最小的超键。 - 主键(primary key):在一个关系中的候选键中指定一个来表示,主键不能为空值,也不能重复。一个关系中候选键可能有多个,但只能选择一个作为主键!在E-R图中主键用属性名带下划线标识。
- 外键:在一个关系A中,有一个属性b不是关系A主键或候选键,但是是另一关系B的主键,这中情况属性b则是关系A中的外键。
主键和外键是数据库设计中我们最常用到,最熟悉的!
注:学习函数依赖时我们再用函数依赖定义一下键,就更好理解了。
6.正确认识数据冗余
- 主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚(没错我也不清楚~)。**非键字段的重复出现, 才是数据冗余!**而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。
- 〖举个栗子〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
7.函数依赖(稍微复杂一点,需静心!实在看不下去可跳过,感觉不会太重点问这种难理解的抽象理论知识)
定义:若关系R的任意两个元组在属性A1、A2、…、An上一致(即有相同分量值),则这两个元组在属性B上也一致,则称属性A1A2…An函数决定B,或称B函数依赖于A1A2…An 。 记为 A1A2…An → B
怎样分析一个具体关系中的函数依赖:
1.根据实体属性之间的语义关系分析函数依赖
2.应考虑所有可能的属性组合
3.尽可能使函数依赖式的左面(A)最小化,右面(B)最大化。部分函数依赖:若X → Y,且存在X的真子集X’, X’→ Y,则称Y对X部分函数依赖。
完全函数依赖:若X → Y,且Y对X不是部分函数依赖,则称Y对X是完全函数依赖。
传递函数依赖:若X → Y,Y → Z,且Y → X,则称Z对X是传递函数依赖。
用函数依赖再次理解一下键
定义:对于关系R,若属性集合{A1,A2,…,An}满足下列条件,则该属性集合是R的一个键key:
1.A1,A2,…,An函数决定R中所有其他属性。(超键)
2.{A1,A2,…,An}的任何真子集都不能函数决定R中所有其他属性。(最小化=候选键)
注:函数依赖的定义是形式化的定义,而E/R模型中键的定义是一种非形式化的语义说明。二者是一致的。
- 什么是函数依赖规则:在一个给定关系上,已知一组函数依赖作为前提条件。根据一组函数依赖规则,推断另一些函数依赖。
- 为何需要函数依赖规则:可以根据函数依赖的计算和验证来有效地减少冗余,得到良好的关系设计。
- 常见的函数依赖规则:分解/合并规则、平凡依赖规则、传递规则、Armstrong公理
注:具体就不仔细讲解了,大家有兴趣查阅查阅别的资料吧! - 两个函数依赖集合之间有何关系:
1.设T是关系R上的函数依赖集,若对R的所有实例,函数依赖X → Y都成立,则称T“逻辑蕴含” X → Y。(X → Y可由T推导出来)
2.设S是关系R上的另一函数依赖集,若对R的所有实例,S中的所有函数依赖均成立,则称函数依赖集S“蕴含于”函数依赖集T。(S可由T推导出来)
3.若函数依赖集S“蕴含于” T,同时T“蕴含于”S,则函数依赖集S“等价于”函数依赖集T。 - 蕴含和等价关系有何用处
1.可用等价的更简单的函数依赖集代替复杂的函数依赖集。
2.可在一个函数依赖集S中增加蕴含其中的其它函数依赖。
3.可判断一个函数依赖是否蕴含于已知的函数依赖集。
8.异常
什么是异常:即数据库设计不符合规范,在操作数据库时,影响数据一致性。主要有下列三种异常?
- 冗余。同一信息在多个元组中不必要的重复。浪费空间,增加更新操作的复杂度,影响数据一致性。
- 修改异常。当修改了某个元组中的信息,而重复的信息可能未修改而破坏一致性。插入数据时,某些有用信息暂时无法插入。
- 删除异常。当删除某个元组时,可能删除其它信息;若需删除某个对象时,必须删除多个元组而不是一个元组。否则,破坏数据一致性。
9.范式
范式理论是为了规范数据库的设计,解决以上异常的。高级别的范式依赖于低级别的范式,1NF是最低级别的范式。
- 第一范式(1NF):数据库表中的所有属性值都是不可分割的原子值。
- 第二范式(2NF):数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关。
- 第三范式(3NF):数据库表中的每一列和主键直接相关,而不是间接相关。也就是属性不能传递依赖于主属性。
- 实际上还有一些范式,但是考试中一般不涉及,因为实在是太深了,一般设计数据库也不会死磕。这点应付考试差不多了。
注:基本表及其字段之间的关系,应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的(这在算法中也是经常借鉴的,所以学习需要我们经常思考,寻找更优解!)。也就是讲数据冗余时我们所说的提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
10.E-R图
这个学过数据库都应该比较熟练了,简单回忆一下即可。别到时候问到了说不上来。
关系实体图(Entity-Relationship),有三个组成部分:实体、属性、联系。用来进行关系型数据库系统的概念设计。
- 实体:用矩形表示,矩形框内写明实体名。(还有弱实体,用双矩形表示,了解即可。)
- 属性:用椭圆形表示,并用无向边将其与对应的实体连接起来。
- 联系:用菱形表示,菱形框内写明联系名,并用无向边分别有关实体连接起来。同时在无相边旁标上联系的类型(1…1、1…* 、* … *)即一对一、一对多、多对多关系。
11.ER模型转换为关系模型的原则(重要!)
- 一对一:遇到一对一关系的话,在两个实体任选一个添加另一个实体的主键即可。
- 一对多:遇到一对多关系的话,在多端添加另一端的组件。
- 多对多:遇到多对多关系的话,我们需要将联系转换为实体,然后在该实体上加上另外两个实体的主键作为联系实体的主键(如学生选课表S-C),然后再加上该联系自身带的属性即可。这样将一个多对多关系分解成了两个一对多关系,要善于解决多对多关系。
12.索引
树是学习数据结构时最重要的数据结构之一,在查找算法中,我们学过B-树和B+树,索引即查找,同样可用B-树和B+树进行。
- B-树:(Balance-Tree):也称为多路平衡查找树,所有的叶子节点位于同一层。
- B+树:它不仅具有B-树的平衡性,并且可以通过顺序访问指针来提高区间查找的性能。
它们的最大区别是,B+树的非叶子结点不保存数据,只用于索引,所有的数据都保存在叶子节点中,并且叶子结点间按照从小到大顺序链接起来。这也是为什么SQL数据库会采用B+树来进行索引。相同的外存空间,用B+树数据结构进行索引能装下更多数据,索引速度更快。(参见《数据结构》)
13.触发器
一个触发器是存储在某个表中的一个命名的数据库对象。当该表进行某种数据更新时,将自动触发一组SQL语句的执行。使用触发器可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。触发器不要设计的太复杂。
复试面试-数据库面试题相关推荐
- 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点
查询在什么情况下不⾛索引 数据库面试题 ⾸先,我们可以说通过explain去排查⼀个慢查询,进⽽找到它的索引(参看第五题),当创建索引却不⾛索引时,我们就需要考虑到优化器的问题. 在⼀条单表查询语句真 ...
- C# 联合查询_直击数据库面试题:数据库查询语句
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- MySQL数据库面试题(2021最新版)
文章目录:http://github.crmeb.net/u/defu 数据库基础知识 为什么要使用数据库 什么是SQL? 什么是MySQL? 数据库三大范式是什么 mysql有关权限的表都有哪几个 ...
- datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...
原文: https://www.enmotech.com/web/detail/1/794/1.html 两万字全面论述数据库面试题(上) https://www.enmotech.com/web/d ...
- 计网/数据库面试题(更新中ing~~)
计网/数据库面试题(更新中ing~~) <计算机网络> 1. OSI七层模型.设备 (传输层)协议的多路分用和复用 2. TCP/IP四层模型==五层模型 (传输层)TCP和UDP协议对比 ...
- SQL编程软件测试,编程程题库之软件测试8大常见数据库面试题
原标题:编程程题库之软件测试8大常见数据库面试题 一.事务的四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前其它会话不能看到过程一致性,事务前后,数据总额一致持久性,一旦事务提交 ...
- mysql纵表 主键_数据库面试题-sql语句
原标题:数据库面试题-sql语句 1,写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的. 答: → 解1: select top ...
- Oracle数据库面试题 精选 Oracle 面试题
Oracle数据库面试题 1.解释冷备份和热备份的不同点以及各自的优点 冷备份 发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法.适用于所有模式的数据库. 优点 1. 是非常快速 ...
- 2020字节跳动数据库面试题及答案(二)—— NoSQL部分
本文答案整理为原创,转载请说明出处 文章目录 redis 的底层数据结构有哪些 redis 中的 SDS 和 C 语言中的字符串有什么区别,优点是什么 redis 中的字典是如何实现的,如何解决冲突和 ...
最新文章
- 创建存储器_Microchip推出首款低功耗数模转换器,集成非易失性存储器,简化手持设备设计...
- 牛逼!硬核图解 Tomcat 整体架构
- 学计算机出来的大佬,学计算机专业的大佬能否解答一下
- (二十)java多线程之ScheduledThreadPoolExecutor
- 常见宽带错误解决方法
- 一个Quake2的世界浏览器DEMO(附源码)
- android ble从设备,从Android设备发送命令到蓝牙
- oracle创建自身连接,oracle菜鸟学习之 自连接查询实验
- java程序员年龄大了怎么办,互联网行业“中年”危机
- 有源带阻和无源带阻的区别_发明有源低音炮的 Ken Kreisel重新定义了低音炮:把玩DXD300A/B...
- linux 编写shell管理脚本01。2
- 关于数据库查询时报“query block has incorrect number of result columns”
- spring 中scope的singleton和prototype区别
- 【笔记】mac上如何用命令行编译jni
- 常微分方程的解析解(方法归纳)以及基于Python的二阶微分方程边值问题的数值算例实现
- 【机器学习手册】【1】熟练使用向量矩阵和数组 —— 二维矩阵叉乘公式
- php获得视频文件扩展名,php 获取文件扩展名的 n 种方法
- java跑酷游戏_HTML5游戏实战(1):50行代码实现正面跑酷游戏
- 2017春节~人生智慧箴言
- 2019双十一自动领喵币