数据库_面试问题【未完待续】

 参考了大佬的分享:@小师兄.【34个数据库常见面试题讲解】

一,数据库技术基础

1,视图

具体可以查看这位博主的文章@不会看见【数据库--视图的基本概念以及作用】

定义 

视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储
对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,
多表视图一般用于查询,不会改变基本表的数据。

作用

①简化了操作,把经常使用的数据定义为视图。

②安全性,用户只能查询和修改能看到的数据。

③逻辑上的独立性,屏蔽了真实表的结构带来的影响。

缺点

①性能差  数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
②修改限制  当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
 

二,关系模型

 

三,SQL语言

 

四,数据库的完整性与安全性

 

五,数据库编程

1,触发器的作用与执行

  • 定义:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性。
  • 执行:触发器的执行,是由触发事件激活的,并由数据库服务器自动执行(断言是数据库管理系统检测)

2,存储过程

  • 定义:过程化SQL编写基本的SQL是高度非过程化的语言。嵌入式SQL将SQL语句嵌入程序设计语言,借助高级语言的控制功能实现过程化。过程化SQL是对SQL的扩展,使其增加了过程化语句功能的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可 。
  • 优点:1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。

 3,索引

  • 作用:加快查询速度;
  • 类型:基于顺序文件的索引、B+树索引、哈希索引、位图索引等;
  • 不适合建立索引:1,不出现或很少出现在查询条件中的属性;2,属性值很少的属性;3,属性值分布严重不均的属性;4,经常更新的属性或表;5,过长属性;6,太小的表;
  • 适合建立索引:1,主码和外码一般都应建索引;2,以读为主或只读表,只要空间允许可以多建索引;3,等值查询,且满足条件的元组数<5%,可以在相关属性上建索引;4,范围查询,可以考虑在相关属性上建索引

4,事务

定义:

  • 构成单一逻辑工作单元的数据库操作序列
  • 一个不可分割的工作单位;
  • 恢复和并发控制的基本单位
  • 一个事务就是将一系列的数据操纵SQL语句作为一个逻辑单元,逻辑单元里面的单个操作要么全做,要么全部不做,以保证数据的完整性

ACID特性

  • 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做;
  • 一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的;
  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持续性(Durability ):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

5,锁

这位博主写的很详细!想要更深入了解的同学,可以戳这里@阿骆麦迪【数据库事务与锁详解】

在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。

数据库并发操作异常情形:

  • 第一类丢失更新(Update Lost):此种更新丢失是因为回滚的原因,所以也叫回滚丢失。此时两个事务同时更新count,两个事务都读取到100,事务一更新成功并提交,count=100+1=101,事务二出于某种原因更新失败了,然后回滚,事务二就把count还原为它一开始读到的100,此时事务一的更新就这样丢失了。
  • 脏读(Dirty Read)此种异常时因为一个事务读取了另一个事务修改了但是未提交的数据。举个例子,事务一更新了count=101,但是没有提交,事务二此时读取count,值为101而不是100,然后事务一出于某种原因回滚了,然后第二个事务读取的这个值就是噩梦的开始。
  • 不可重复读(Not Repeatable Read):此种异常是一个事务对同一行数据执行了两次或更多次查询,但是却得到了不同的结果,也就是在一个事务里面你不能重复(即多次)读取一行数据,如果你这么做了,不能保证每次读取的结果是一样的,有可能一样有可能不一样。造成这个结果是在两次查询之间有别的事务对该行数据做了更新操作。举个例子,事务一先查询了count,值为100,此时事务二更新了count=101,事务一再次读取count,值就会变成101,两次读取结果不一样。
  • 第二类丢失更新(Second Update Lost)此种更新丢失是因为更新被其他事务给覆盖了,也可以叫覆盖丢失。举个例子,两个事务同时更新count,都读取100这个初始值,事务一先更新成功并提交,count=100+1=101,事务二后更新成功并提交,count=100+1=101,由于事务二count还是从100开始增加,事务一的更新就这样丢失了。
  • 幻读(Phantom Read):幻读和不可重复读有点像,只是针对的不是数据的值而是数据的数量。此种异常是一个事务在两次查询的过程中数据的数量不同,让人以为发生幻觉,幻读大概就是这么得来的吧。举个例子,事务一查询order表有多少条记录,事务二新增了一条记录,然后事务一查了一下order表有多少记录,发现和第一次不一样,这就是幻读。
     

锁机制

一般可以分为两类,一个是悲观锁,一个是乐观锁,悲观锁一般就是我们通常说的数据库锁机制,乐观锁一般是指用户自己实现的一种锁机制。

悲观锁

悲观锁按照使用性质划分:

共享锁(Share locks简记为S锁):也称读锁事务A对对象T加s锁,其他事务也只能对T加S,多个事务可以同时读,但不能有写操作,直到A释放S锁。
排它锁(Exclusivelocks简记为X锁):也称写锁事务A对对象T加X锁以后,其他事务不能对T加任何锁,只有事务A可以读写对象T直到A释放X锁。
更新锁(简记为U锁):用来预定要对此对象施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的对象将要被更新时,则升级为X锁,主要是用来防止死锁的。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个对象申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。
 

乐观锁 

顾名思义,就是很乐观,每次自己操作数据的时候认为没有人回来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改,需要用户自己去实现。

既然都有数据库提供的悲观锁可以方便使用为什么要使用乐观锁呢?对于读操作远多于写操作的时候,大多数都是读取,这时候一个更新操作加锁会阻塞所有读取,降低了吞吐量。最后还要释放锁,锁是需要一些开销的,我们只要想办法解决极少量的更新操作的同步问题。换句话说,如果是读写比例差距不是非常大或者你的系统没有响应不及时,吞吐量瓶颈问题,那就不要去使用乐观锁,它增加了复杂度,也带来了额外的风险。
 

6,游标

是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

六,关系数据理论

1,范式

第一范式(1NF)

定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

存在:非主属性(dno)对码(sno,cname)的部分函数依赖!

第二范式(2NF)

定义:若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。

问题:将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。(存在非主属性(dmanager)对码的传递函数依赖!)

第三范式(3NF)

定义:关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z  Y), 使得X→Y,Y→Z成立,Y → X,则称R<U,F> ∈ 3NF。(若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。)

BC范式(BCNF)

定义:关系模式R<U,F>∈1NF,若X→Y且Y 不包含于X时X必含有码,则R<U,F> ∈BCNF。

等价于:每一个决定属性因素都包含码。

若R∈BCNF :

  • 所有非主属性对每一个码都是完全函数依赖;
  • 所有的主属性对每一个不包含它的码,也是完全函数依赖;
  • 没有任何属性完全函数依赖于非码的任何一组属性。

 

七,数据库设计

 

八,查询处理与优化

1,查询优化

代数优化

  1. 选择运算应尽可能先做。在优化策略中这是最重要、最基本的一条;
  2. 投影运算和选择运算同时进行
  3. 把投影同其前或其后的双目运算结合起来;
  4. 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算;
  5. 找出公共子表达式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章